本文是對typeof
和instanceof
兩個操做符的總結。javascript
在講這兩個操做符以前,須要把相關的概念先行說明。java
ES6前有5種簡單數據類型,分別是
Undefined
,Null
,Boolean
,Number
,String
; 還有一種複雜數據類型Object
而ES6又增長了一種Symbol
數組
const [a1, b1, c1, d1, e1, f1, g1] = [undefined, null, false, NaN, "abc", {}, Symbol()];
console.log(typeof a1); // undefined
console.log(typeof b1); // object
console.log(typeof c1); // boolean
console.log(typeof d1); // number
console.log(typeof e1); // string
console.log(typeof f1); // object
console.log(typeof g1); // symbol
const h1 = function () {};
console.log(typeof h1); // function
const [i1, j1, l1, m1, n1] = [new Date(), /\s/, Math.sign, Math.PI, []];
console.log(typeof i1); // object
console.log(typeof j1); // object
console.log(typeof l1); // function
console.log(typeof m1); // number
console.log(typeof n1); // object
複製代碼
由此能夠看出能夠使用typeof檢測判斷出來的是undefined
, boolean
, number
, symbol
, function
, string
, 但須要注意的是boolean
, number
, string
的值都不能經過new
出來的,不然檢測出的都是object
,而function
不受影響,例如:ui
const a2 = new Boolean(false);
const b2 = new Number(25);
const c2 = new String('abc');
console.log(typeof a2); // object
console.log(typeof b2); // object
console.log(typeof c2); // object
const d2 = new Function('a', 'b', 'return a + b');
console.log(typeof d2); // function
複製代碼
由於typeof
不能檢測出引用的數據類型,例如數組、正則等等使用typeof
檢測出的都是object
spa
基本類型的數據使用
instanceof
始終判斷false
,由於基本類型不是對象指針
const [a3, b3, c3, d3] = [[], {}, new Date(), /\s/];
console.log(a3 instanceof Array); // true
console.log(b3 instanceof Object); // true
console.log(c3 instanceof Date); // true
console.log(d3 instanceof RegExp); // true
const e3 = new Boolean(false);
const f3 = new Number(25);
const g3 = new String('abc');
console.log(e3 instanceof Boolean); // true
console.log(f3 instanceof Number); // true
console.log(g3 instanceof String); // true
複製代碼
值得注意的是有兩個意外code
const h3 = null;
console.log(h3 instanceof Object); // false
const i3 = function() {};
console.log(i3 instanceof Function); // true
console.log(i3 instanceof Object); // true
複製代碼
爲何會這樣呢?對象
從它的語法中咱們能夠看出result = variable instanceof constructor
它是經過該操做符尋找它的引用類型,而全部引用類型的值都是Object
的實例,這也就解釋了全部的對象使用instanceof
的時候結果都爲true
blog
const [a4, b4, c4] = [[], {}, new Date(), /\s/];
console.log(a4 instanceof Object); // true
console.log(b4 instanceof Object); // true
console.log(c4 instanceof Object); // true
複製代碼
null
是空對象指針,所以typeof null === 'object'
,然而null
又不是object
的引用類型的實例,所以使用instanceof
會顯示false
教程