说说instanceof和typeof的实现原理并自己模拟实现一个instanceof
instanceof 和 typeof 都是 JavaScript 中用于类型检测的操作符,但它们的实现原理和工作方式有所不同。
typeof
typeof 是一个一元操作符,用于返回操作数的数据类型。在 JavaScript 中,数据类型包括 number、string、boolean、object、function、undefined、symbol(ES6 新增)等。typeof 的返回值是这些类型名称的字符串形式。
typeof 的实现原理相对简单,它直接根据操作数的内部类型标签返回对应的字符串。这个操作是在 JavaScript 引擎内部实现的,我们无法直接模拟。
instanceof
instanceof 是一个二元操作符,用于检测一个对象是否是某个构造函数的实例。如果是,返回 true;否则,返回 false。
instanceof 的实现原理稍微复杂一些。它基于原型链进行查找。当使用 instanceof 检查对象 obj 是否是构造函数 Func 的实例时,JavaScript 引擎会执行以下步骤:
- 获取
obj的原型链(即obj.__proto__、obj.__proto__.__proto__、...)。 - 获取
Func的prototype属性。 - 比较
obj的原型链中的每一个原型对象是否与Func.prototype相同。如果相同,则返回true,表示obj是Func的实例;否则,继续查找原型链中的下一个原型对象。 - 如果查找到原型链的末尾(即
null)仍未找到与Func.prototype相同的原型对象,则返回false,表示obj不是Func的实例。
模拟实现 instanceof
基于上述原理,我们可以模拟实现一个 instanceof 函数:
function myInstanceof(obj, Func) {
if (typeof obj !== 'object' || obj === null) {
return false;
}
if (typeof Func !== 'function') {
throw new Error('Right-hand side of instanceof is not a function');
}
let proto = obj.__proto__;
while (proto) {
if (proto === Func.prototype) {
return true;
}
proto = proto.__proto__;
}
return false;
}
这个函数接受两个参数:obj 表示要检查的对象,Func 表示构造函数。函数首先检查 obj 是否是对象且不为 null,以及 Func 是否是函数。然后,它遍历 obj 的原型链,查找与 Func.prototype 相同的原型对象。如果找到,则返回 true;否则,返回 false。
浙公网安备 33010602011771号