instanceof 运算符是用来检测某个实例对象的原型链上是否存在构造函数的 prototype 属性。
通常用 typeof 来判断基本类型,用 instanceof 来判断引用类型。
instanceof 的源码:
function myInstanceof (instanceObj, constructorFun) {
const prototypeObj = constructorFun.prototype; // 获取构造函数的原型对象
instanceObj = instanceObj.__proto__; // 获取实例对象的原型
while(instanceObj) {
if (instanceObj === prototypeObj) {
return true;
}
instanceObj = instanceObj.__proto__;
}
return false;
}
语法: object instanceof constructor
有趣的例子:
function Foo() {
}
Object instanceof Object // true
Function instanceof Function // true
Function instanceof Object // true
Foo instanceof Foo // false
Foo instanceof Object // true
Foo instanceof Function // true
Object instanceof Object:Object 的 prototype 属性是 Object.prototype ,而由于 Object 本身是一个函数,由
Function 所创建,所以 Object. proto_ 的值是 Function.prototype ,而 Function.prototype 的 proto 属性是 Object.prototype 。所以 Object instance Object 的结果为 true 。
但是 instanceof 并不是最好的判断 js 数据类型的解决方案。
Object.prototype.toString.call(xxx) 才是。
Object.prototype.toString.call({})
// '[object Object]'
Object.prototype.toString.call([])
// '[object Array]'
Object.prototype.toString.call(() => {})
// '[object Function]'
Object.prototype.toString.call('wangergou')
// '[object String]'
Object.prototype.toString.call(null)
// '[object Null]'
Object.prototype.toString.call(undefined)
// '[object Undefined]'
参考链接: