前言
本文是对typeof
和instanceof
两个操作符的总结。
数据类型
在讲这两个操作符之前,需要把相关的概念先行说明。
ES6前有5种简单数据类型,分别是
Undefined
,Null
,Boolean
,Number
,String
; 还有一种复杂数据类型Object
而ES6又增加了一种Symbol
typeof检测
举例说明
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
不受影响,例如:
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
instanceof
因为typeof
不能检测出引用的数据类型,例如数组、正则等等使用typeof
检测出的都是object
基本类型的数据使用
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
两个意外
值得注意的是有两个意外
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
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