instanceof
可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的 prototype
。
function instanceof1(obj,Object) {
let prototype = Object.prototype
if (obj === null || obj === undefined || !obj || (typeof obj !== 'object' && typeof obj !== 'function')) // 主要用于对象类型判断
return false
while (obj.__proto__) {
if (prototype === obj.__proto__) // 重点
return true
obj = obj.__proto__
}
}
以下是对实现的分析:
- 首先获取类型的原型
- 然后获得对象的原型
- 然后一直循环判断对象的原型是否等于类型的原型,直到对象原型为
null
,因为原型链最终为null
举个例子: var arr = [1,2,3]; arr instanceof Array 这里的arr和Array分别是上述函数内的obj和Object,
arr的__proto__和Array的原型prototype一致(具体为什么可查看对 JavaScript原型及原型链 的理解)
具体可以看下图内容:
instanceof是不能检测直接量的,如:字符串、数字。
instanceof的用途是判断一个对象是否在某个对象原型链上。或者说判断一个对象是某个对象的实例。
例如:
如果拿instanceof去检测字符串
const a='123';
a instanceof String
这个肯定返回的是false,但是这里不一定是不对的,因为instanceof不能直接检测字符串和数字,所以会返回false。
只有经过显示的实例化转化,才能进行判断。
var a=Number(1);
a instanceof Number; //true
var b=String("123");
b instanceof String; //true