一、instanceof的作用?
用来判断一个对象实例的类型是否是某构造函数,也可以用来判断对象实例是否属于其原型链上的祖先类型。
说白了,只要右边变量的prototype
在左边变量的原型链上即可。因此,instanceof
在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype
,如果查找失败,则会返回 false
。
二、instanceof语法?
[对象] instanceof [构造函数]
var obj = new Object()
obj instanceof Object // true
三、instanceof的原理?
底层原理实现:
// L:对象实例 R:构造函数或者父类型实例
function instance_of(L, R) {
// 显式原型
let O = R.prototype;
// 隐式原型
let L = L.__proto__;
//循环遍历,进行判断两个值是否相等,相等返回true,不相等继续查找L的原型链
while(true) {
if (L === null)
return false;
if (O === L)
return true;
L = L.__proto__;
}
}
四、注意
instanceof 用于判断对象类型,但以下情况的结果都为false,请注意。
console.log(Number instanceof Number) // false
console.log(String instanceof String) // false
console.log(Fun instanceof Fun) // false,这里Fun指的是函数
console.log(null instanceof Object) // false,null不具有任何对象的特性,也没有__proto__属性