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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:48:03