instanceof 的小秘密

instanceof 运算符用于检测某个构造函数的 prototype 属性,是否存在于对象的原型链上。

javascript 复制代码
class Cat {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}

const cat = new Cat("Mittens", 3);

console.log(cat instanceof Cat); // true
console.log(cat instanceof Object); // true

instanceof 接收两个参数,v(左)和target(右),判断v是否为target的实例对象,方法是先查询target的Symbol.hasInstance属性,如果不存在,则判断target的prototype属性是否存在v的原型中。

javascript 复制代码
class Cat {

    static [Symbol.hasInstance](instance) {
        return false
    }

    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}

const cat = new Cat("Mittens", 3);

console.log(cat instanceof Cat); // false
console.log(cat instanceof Object); // true
console.log(cat instanceof null) // TypeError: Right-hand side of 'instanceof' is not an object

或许有人会想到1 intanceof Number和1 intanceof Object为什么会是false呢?明明(1).__proto__是有值的,为什么呢?这里就不得不提到JS的一个机制"自动装箱"。

我们定义一个变量const n = 1, n是一个原始值,有以下特点:

  • 不可变性:原始值本身不能被修改,任何"修改"操作都会创建新值
  • 按值传递:赋值时复制值,而不是引用
  • 没有属性和方法:原始值本身不是对象,不能直接拥有属性和方法

在访问原始值属性或者方法时,Js会创建一个临时对象,使用后便会销毁。

javascript 复制代码
const n = 1;
n.toString()

// JavaScript 内部实际执行的过程 
// 1. 创建临时 Number 对象:new Number(1) 
// 2. 调用方法:numberObj.toString() 
// 3. 返回结果:"1" 
// 4. 销毁临时对象

但是在intanceof操作时,不会进行"自动装箱",所以得到的结果为false。

相关推荐
时间海8712 分钟前
对象键清洗之前,先拦住重名
javascript·后端
挖掘狂人1 小时前
Java 26 深度解析:一次“性能兑现 + 契约收紧”的版本
javascript·后端·性能优化
霍营_托尼1 小时前
微信小程序点餐项目实战:飞入动画、样式错位、弹窗不消失,7 个前端坑的完整排障记录
javascript·微信小程序·动效
Hilaku2 小时前
为什么我劝应届生不要去创业公司写前端?
前端·javascript·程序员
晓得迷路了3 小时前
栗子前端技术周刊第 149 期 - Vite+ 1.0、Preact 11、Next.js 16.4...
前端·javascript·react.js
前端一小卒3 小时前
搜索 API 额度用完返回空数组,Agent 就开始一本正经地胡说
前端·javascript·node.js
w2sfot3 小时前
AI时代,JS加密还有效吗?
开发语言·前端·javascript
haluhalu.3 小时前
Agent = LLM + 上下文 + 工具(含观察 / 动作空间、ReAct 循环)
前端·javascript·人工智能·python·react.js·机器学习·个人开发
子兮曰9 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
paopaokaka_luck12 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis