基本有5種基本數據類型:String
,Number
,Boolean
,Null
,undefined
。
1種複雜的數據類型Object
,好比Object
、array
、function
、data
等。函數
ES6新增了一種基本數據類型
symbol
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]
typeof
(有bug)typeof
能檢測到的數據有function
、string
,number
,boolean
, undefined
,symbol
,其餘全部的類型,都會被檢測爲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
會顯示object
prototype
console.log(typeof null); // object
在 JS 的最第一版本中,使用的是 32 位系統,爲了性能考慮使用低位存儲了變量的類型信息,000 開頭表明是對象,然而 null 表示爲全零,因此將它錯誤的判斷爲 object 。雖然如今的內部類型判斷代碼已經改變了,可是對於這個 Bug 倒是一直流傳下來。
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
轉換成對象,才能準確判斷他的數據類型。
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 // 控制檯報錯
- null 和 undefined 是無效的對象,所以是不會有 constructor 存在的。
- 函數的 constructor 是不穩定的,當開發者重寫 prototype 後,原有的 constructor 引用會丟失,constructor 會默認爲 Object。