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
相关产品推荐
相关产品推荐

