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的实例对象,方法是先查询targetSymbol.hasInstance属性,如果不存在,则判断targetprototype属性是否存在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 Number1 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

相关推荐
放下华子我只抽RuiKe57 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架
XinZong8 小时前
OpenClaw 实现双重心跳(Heartbeat)+ clawreach虾聊项目实现
javascript
还有多久拿退休金10 小时前
一张栈的图,治好你面试答不出 script 阻塞的病
前端·javascript
zithern_juejin10 小时前
原型与原型链
javascript
008爬虫实战录12 小时前
【码上爬】 题十二:如来神掌 困难, JSVMP加密,使用代理补环境
前端·javascript·node.js
threelab12 小时前
Three.js 数学函数着色器 | 三维可视化 / AI 提示词
javascript·人工智能·着色器
ZC跨境爬虫13 小时前
跟着 MDN 学CSS day_3:(为一个传记页面添加样式)
前端·javascript·css·ui·音视频·html5
夜雪闻竹14 小时前
sql.js WASM 实战:浏览器里跑 SQLite
javascript·sql·wasm
爱喝铁观音的谷力景辉14 小时前
在Cesium中实现带箭头方向路线样式的技术详解
javascript·cesium
Qhappy14 小时前
AI逆向实战:从零还原某航空App的AES加密
javascript·后端