本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、什么是instanceof,与typeof有什么区别
typeof用于判断对象基本类型,可能只如下
- 空值(null)
- 未定义(undefined)
- 布尔值(boolean)
- 数字(number)
- 字符串(string)
- 对象 (object)
- 符号(symbol, ES6中新增)
- 大整数(BigInt, ES2020 引入)
instanceof用于判断一个实例是否属于某种类型,也就是判断一个实例是否是其父类型或者祖先类型的实例,返回一个布尔值。
二、instanceof原理
其实就是判断要检测的对象是否继承于某个构造函数
object instanceof constructor
// 等同于
constructor.prototype.isPrototypeOf(object)
instanceof原理: 检测 constructor.prototype是否存在于参数 object的 原型链上。
instanceof 查找的过程中会遍历object的原型链,直到找到 constructor 的 prototype ,如果查找失败,则会返回false,告诉我们,object 并非是 constructor 的实例。
三、手写一个instanceof
理解了第二小节的instanceof查找原理,再写出instanceof的实现就很简单了。这里我们使用一个函数模拟实现
function myInstanceof(L, R) { //L是表达式左边,R是表达式右边
const O = R.prototype;
L = L.__proto__;
while (true) {
if (L === null) { // 找到原型链最顶层null还没找到?直接返回false
return false;
}
if (L === O) {// 这里重点:当 L 严格等于 0 时,返回 true
return true;
}
L = L.__proto__;
}
}
来测试一下
myInstanceof('nice', String) // true
myInstanceof(222, String) // false
测试通过
