JavaScript中如何修改原始值包装对象的原始值且不丢失自定义属性
结论先行
JavaScript 中 Number、String、Boolean 这类原始值包装对象的内部[[PrimitiveValue]]私有槽由引擎维护,没有对外暴露可修改的标准API,你无法直接修改已有包装对象绑定的原始值。要实现你要的输出效果,最稳妥的方案是新建包装对象后批量拷贝原有自定义属性。
可行实现代码
var x = new Number(7); x.source = "never-you-mind"; console.log(x); // Number {7, source: 'never-you-mind'} // 执行修改操作 const newX = new Number(777); // 批量拷贝所有自有自定义属性,不需要手动逐个赋值 Object.assign(newX, x); x = newX; console.log(x); // Number {777, source: 'never-you-mind'}
其他可选方案(仅特殊场景使用)
如果你不需要严格匹配console打印的对象结构,只需要这个对象参与数值运算、类型转换时表现为777,可以重写它的valueOf和toString方法,不需要修改x的引用:
x.valueOf = () => 777; x.toString = () => '777'; // 以下操作都会得到预期的777相关结果 console.log(Number(x)); // 777 console.log(x + 1); // 778 console.log(x == 777); // true
这个方案的局限性是console.log打印对象时,仍然会显示原始的内部值{7, source: 'never-you-mind'},无法满足你给出的输出要求。
注:不要尝试通过非标准的私有属性修改
[[PrimitiveValue]],比如部分引擎暴露的内部属性,这类写法兼容性极差,随时可能失效。
内容的提问来源于stack exchange,提问作者Erics
相关产品推荐
相关产品推荐

