js如何判斷(複雜)數據類型

JS的數據類型

基本有5種基本數據類型:StringNumberBooleanNullundefined
1種複雜的數據類型Object,好比Objectarrayfunctiondata等。函數

ES6新增了一種基本數據類型 symbol

1. Object.prototype.toString.call()(推薦使用)

該方法最繁瑣,但最通用(簡單和複雜類型均可以檢測)
let a = [];
let b = function () {}
let c = 4;
let d = null;

console.log(Object.prototype.toString.call(a));
console.log(Object.prototype.toString.call(b));
console.log(Object.prototype.toString.call(c));
console.log(Object.prototype.toString.call(d));

// [object Array]
// [object Function]
// [object Number]
// [object Null]

2. typeof(有bug)

typeof能檢測到的數據有functionstringnumberbooleanundefinedsymbol,其餘全部的類型,都會被檢測爲object性能

let a = [];
let b = function () {};
let c = 4;

console.log(typeof a);
console.log(typeof b);
console.log(typeof c);

// object
// function
// number

bug實例
null是基本數據類型,但使用typeof會顯示objectprototype

console.log(typeof null);
// object
在 JS 的最第一版本中,使用的是 32 位系統,爲了性能考慮使用低位存儲了變量的類型信息,000 開頭表明是對象,然而 null 表示爲全零,因此將它錯誤的判斷爲 object 。雖然如今的內部類型判斷代碼已經改變了,可是對於這個 Bug 倒是一直流傳下來。

3. instanceof(只能判斷對象類型)

let a = [];
let b = function () {};
let c = 4;
let d = new Number(4);

console.log(a instanceof Array);
console.log(b instanceof Function);
console.log(c instanceof Number);
console.log(d instanceof Number);

// true
// true
// false
// true
在上例代碼中能夠看出必須經過包裝類 Number把數字 4轉換成對象,才能準確判斷他的數據類型。

4. constructor(不穩定)

let a = [];
let b = function () {};
let c = 4;
let d = null;

console.log(a.constructor === Array);
console.log(b.constructor === Function);
console.log(c.constructor === Number);
console.log(d.constructor === null);

// true
// true
// true
// 控制檯報錯
  1. null 和 undefined 是無效的對象,所以是不會有 constructor 存在的。
  2. 函數的 constructor 是不穩定的,當開發者重寫 prototype 後,原有的 constructor 引用會丟失,constructor 會默認爲 Object。
相關文章
相關標籤/搜索