在基础笔记第二篇就已经了解过了 typeof 操作符的用法:用来判断一个变量哪种数据类型。
虽然在一般情况下 typeof 就已经可以满足一些使用需求,但是像如下情况,使用 typeof 就不太好区分了:
let arr = [1, 2, 3]
let obj = {};
console.log(typeof arr); // object
console.log(typeof obj); // object
可以看出,我们显然是想要知道 arr 是不是 Array 类型,但是 typeof 却并不能满足我们这个需求。这时就需要用到 instanceof 操作符了。
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。可以理解为是否是由某个构造函数构成。在以上例子中使用 instanceof 操作符:
let arr = [1, 2, 3]
let obj = {};
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true
console.log(obj instanceof Array); // false
console.log(obj instanceof Object); // true
当 instanceof 使用于基础数据类型时,容易出错:
let num = 1;
let numo = new Number(1);
console.log(num instanceof Number); // false
console.log(numo instanceof Number); // true
console.log(typeof num); // number
let str = 'this';
let stro = new String('this');
console.log(str instanceof String); // false
console.log(stro instanceof String); // true
console.log(typeof str); // string
let bool = true;
let boolo = new Boolean(true);
console.log(bool instanceof Boolean); // false
console.log(boolo instanceof Boolean); // true
console.log(typeof bool); // boolean
可以看出 instanceof 适用于引用数据类型,原始数据类型则使用 typeof 更好。
但是使用 typeof 判断原始数据类型时,当其为对象会 null 时,typeof 都将返回 object 。
用 typeof 检测函数时会返回 function 。
只要变量是给定引用类型(由原型链决定,原型链将在后面解析)的实例,则 instanceof 操作符将返回 true 。