instanceof用于判断一个对象是否为另一个对象的实例
let Person = function () {};
let p = new Person();
console.log(p instanceof Person);
它不能对非对象类型进行判断,也就是说不能通过它对非引用类型值进行判断是否为某个对象的实例
let num = 1;
console.log(num instanceof Number);
instanceof是通过关键字前面的对象的__proto__隐式原型链一层一层的向上寻找查看是否有与之相等的构造函数的prototype对象。既然知道了他的原理那让我们来实现一个_instanceof函数
function _instanceof(A, B) {
let Bproto = B.prototype;
let Aproto = A.__proto__;
while (true) {
if (Aproto === null) {
return false;
}
if (Aproto === Bproto) {
return true;
}
Aproto = Aproto.__proto__;
}
};
接下来让我们使用上面的_instanceof函数来判断一下是否满足预期
let a = new String("1");
let b = 1;
console.log(_instanceof(a, String));
console.log(_instanceof(b, Number));
let Person = function () {};
let p = new Person();
console.log(_instanceof(p, Person));
通过上述结果可以看出_instanceof不仅可以对对象进行判断是否A(代称左边对象)的隐式原型链上有B(代称右边对象)的原型。而且可以对非引用类型进行判断。可以得出instanceof对判断的范围进行了限制只要是非引用类型值直接返回false。
第一次写文章如有出错之处,请海涵。