1.功能
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
2.判断参数
参数1:实例(某个实例对象)
参数2:类(某个构造函数)
3.instanceof特性
instanceof在判断实例是否属于某个构造函数时,会自动将实例对象的原型链获取到最底层,所以,即使时[] instanceof Object
这也是为true的
4.仿写instanceof方法
function myInstanceof(target, source) {
if(target === null || (typeof target !== 'object' && typeof target !== 'function')) {
console.error('参数1格式错误')
return false
}
if(typeof source !== 'function') {
console.error('参数2格式错误')
return false
}
let temp = Object.getPrototypeOf(target)
while(true) {
if(temp === null) {
return false
}
if(temp === source.prototype) {
return true
}else {
temp = Object.getPrototypeOf(temp)
}
}
}
instanceof缺陷
1.首先就是instanceof的实例会优先取原型链最底层进行判断,所以[] instanceof Object
这也是为true的。
2.instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。
所以在判断数组类型时优先使用
Array.isArray()