You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中new Number()构造的实例有哪些额外特性?

Number 包装对象(new Number 生成的实例)核心特性

你代码中 a === c 返回 false 的核心原因是:a 是 number 原始值,c 是 Number 构造函数生成的对象实例,二者类型本质不同,除此以外该类包装对象还有以下特性:

  • 类型判定差异
    原始值和包装对象的类型检测结果完全不同:
    typeof 3 // 'number'
    typeof new Number(3) // 'object'
    3 instanceof Number // false
    new Number(3) instanceof Number // true
    
  • 支持持久挂载自定义属性
    原始值调用属性/方法时会临时创建包装对象,调用完成后立即销毁,无法持久存储自定义属性,显式生成的包装对象则支持属性持久化:
    let a = 3
    a.foo = '测试属性'
    console.log(a.foo) // undefined,临时包装对象已销毁
    let c = new Number(3)
    c.foo = '测试属性'
    console.log(c.foo) // '测试属性',属性存储在实例对象上
    
  • 操作时自动拆箱
    包装对象参与数值运算、和原始值做非严格相等判断时,会自动提取内部存储的原始数值:
    let c = new Number(3)
    console.log(c + 5) // 8,返回 number 原始值
    console.log(c == 3) // true,非严格相等时触发拆箱
    console.log(c === 3) // false,全等比较不会自动做类型转换
    
  • 布尔判断特性
    只要是对象实例,哪怕包装的是 0、NaN 这类 falsy 原始值,布尔判断时都会被认定为 truthy:
    let zeroObj = new Number(0)
    if (zeroObj) {
      console.log('代码会执行') // 对象本身为 truthy,该分支正常触发
    }
    if (0) {
      console.log('代码不会执行') // 原始值 0 是 falsy,分支不触发
    }
    
  • 实例间全等比较不相等
    每一次 new Number 都会生成独立的对象实例,哪怕包装的数值完全一致,全等比较结果也为 false:
    let c1 = new Number(3)
    let c2 = new Number(3)
    console.log(c1 === c2) // false,两个实例指向不同的内存地址
    
  • 原型方法和原始值完全一致
    你观察到的 toFixed、toPrecision 等方法都挂载在 Number.prototype 上,原始值调用方法时会临时创建包装对象调用原型方法,所以显式生成的包装实例和原始值能调用的方法没有差异。

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:24:08