首頁  >  文章  >  web前端  >  JavaScript怎麼判斷資料型別? 8 種方式分享

JavaScript怎麼判斷資料型別? 8 種方式分享

青灯夜游
青灯夜游轉載
2023-02-16 14:48:384554瀏覽

JavaScript怎麼判斷資料型別?這篇文章跟大家分享JS 判斷資料類型的 8 種方式,有效幫助工作和麵試,面試官看了微微一笑。

JavaScript怎麼判斷資料型別? 8 種方式分享

1、typeof

  • 只能辨識基礎型別與引用型別

注意:null NaNdocument.all 的判斷

console.log(typeof null); // object
console.log(typeof NaN); // number
console.log(typeof document.all); // undefined

2、constructor

  • #constuctor 指向建立該實例物件的建構子

注意nullundefined 沒有constructor,以及constructor 可以被改寫

String.prototype.constructor = function fn() {
  return {};
};

console.log("云牧".constructor); // [Function: fn]

3、instanceof

  • 語法:obj instanceof Type
  • 功能:判斷 obj 是不是Type 類別的實例,只可用來判斷引用資料
  • # 實作想法:Type 的原型物件是否是obj 的原型鏈上的某個物件
  • 注意:右運算元必須是函數或class

#手寫instanceof

function myInstanceof(Fn, obj) {
  // 获取该函数显示原型
  const prototype = Fn.prototype;
  // 获取obj的隐式原型
  let proto = obj.__proto__;
  // 遍历原型链
  while (proto) {
    // 检测原型是否相等
    if (proto === prototype) {
      return true;
    }
    // 如果不等于则继续往深处查找
    proto = proto.__proto__;
  }
  return false;
}

4、isPrototypeof

  • 是否在實例物件的原型鏈上
  • 基本上等同於instanceof
console.log(Object.isPrototypeOf({})); // false
console.log(Object.prototype.isPrototypeOf({})); // true  期望左操作数是一个原型,{} 原型链能找到 Object.prototype

#5、Object.prototype.toString

  • 利用函數動態this 的特性
function typeOf(data) {
  return Object.prototype.toString.call(data).slice(8, -1);
}

// 测试
console.log(typeOf(1)); // Number
console.log(typeOf("1")); // String
console.log(typeOf(true)); // Boolean
console.log(typeOf(null)); // Null
console.log(typeOf(undefined)); // Undefined
console.log(typeOf(Symbol(1))); // Symbol
console.log(typeOf({})); // Object
console.log(typeOf([])); // Array
console.log(typeOf(function () {})); // Function
console.log(typeOf(new Date())); // Date
console.log(typeOf(new RegExp())); // RegExp

6、鴨子型別偵測

  • #檢查自身屬性的類型或執行結果的類型
  • 通常作為候選方案
  • 範例:kindofp-is-promise

p-is-promise:

const isObject = value =>
  value !== null && (typeof value === "object" || typeof value === "function");

export default function isPromise(value) {
  return (
    value instanceof Promise ||
    (isObject(value) && typeof value.then === "function" && typeof value.catch === "function")
  );
}

kindof:

function kindof(obj) {
  var type;
  if (obj === undefined) return "undefined";
  if (obj === null) return "null";

  switch ((type = typeof obj)) {
    case "object":
      switch (Object.prototype.toString.call(obj)) {
        case "[object RegExp]":
          return "regexp";
        case "[object Date]":
          return "date";
        case "[object Array]":
          return "array";
      }

    default:
      return type;
  }
}

7、Symbol.toStringTag

  • 原理:Object.prototype.toString 會讀取該值
  • 適用場景:需自訂類型
  • 注意事項:相容性
class MyArray {
  get [Symbol.toStringTag]() {
    return "MyArray";
  }
}

const arr = new MyArray();
console.log(Object.prototype.toString.call(arr)); // [object MyArray]

8、等比較

  • 原理:與某個固定值比較
  • 適用場景:undefinedwindowdocumentnull

underscore.js:

##總結

##方法#typeof√×NaN、object、document.allconstructor√部分√可以改寫#instanceof×isPrototypeof##√小心null 和undefined##toString√√小心內建原型鴨子類型-√不得已相容Symbol.toString Tag×√識別自訂物件等比較√
基礎資料類型 #引用類型 #注意事項
##√ 多窗口,右邊建構子或class
×

#√

特殊物件

##加餐:ES6 增強的NaN
  • NaN 和Number.NaN 特點typeof 後面是數字

自己不等於自己
  • delete
不能刪除

##isNaN


如果非數字,隱含轉換傳入結果如果是

NaN
    ,就回傳
  • true,反之回傳false<pre class="brush:js;toolbar:false;">console.log(isNaN(NaN)); // true console.log(isNaN({})); // true</pre>Number.isNaN

判斷一個值是否為數字,且值是否等於NaN

###
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN({})); // false
###其他判斷是否###NaN### 的方法###
function isNaNVal(val) {
  return Object.is(val, NaN);
}

function isNaNVal(val) {
  return val !== val;
}

function isNaNVal(val) {
  return typeof val === "number" && isNaN(val);
}

// 综合垫片
if (!("isNaN" in Number)) {
  Number.isNaN = function (val) {
    return typeof val === "number" && isNaN(val);
  };
}
######indexOf 和includes############indexOf### 無法找到###NaN###,# ##includes### 則可以######
const arr = [NaN];

console.log(arr.indexOf(NaN)); // -1
console.log(arr.includes(NaN)); // true
###【推薦學習:###javascript高階教學###】###

以上是JavaScript怎麼判斷資料型別? 8 種方式分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除