instanceof相关面试题 | 刷题打卡

699 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、什么是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

测试通过

image

END