说说instanceof和typeof的实现原理并自己模拟实现一个instanceof

instanceoftypeof 都是 JavaScript 中用于类型检测的操作符,但它们的实现原理和工作方式有所不同。

typeof

typeof 是一个一元操作符,用于返回操作数的数据类型。在 JavaScript 中,数据类型包括 numberstringbooleanobjectfunctionundefinedsymbol(ES6 新增)等。typeof 的返回值是这些类型名称的字符串形式。

typeof 的实现原理相对简单,它直接根据操作数的内部类型标签返回对应的字符串。这个操作是在 JavaScript 引擎内部实现的,我们无法直接模拟。

instanceof

instanceof 是一个二元操作符,用于检测一个对象是否是某个构造函数的实例。如果是,返回 true;否则,返回 false

instanceof 的实现原理稍微复杂一些。它基于原型链进行查找。当使用 instanceof 检查对象 obj 是否是构造函数 Func 的实例时,JavaScript 引擎会执行以下步骤:

  1. 获取 obj 的原型链(即 obj.__proto__obj.__proto__.__proto__、...)。
  2. 获取 Funcprototype 属性。
  3. 比较 obj 的原型链中的每一个原型对象是否与 Func.prototype 相同。如果相同,则返回 true,表示 objFunc 的实例;否则,继续查找原型链中的下一个原型对象。
  4. 如果查找到原型链的末尾(即 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

posted @ 2025-01-15 09:14  王铁柱6  阅读(41)  评论(0)    收藏  举报