JavaScript中如何实现对象赋值不共享内存指针
JS对象拷贝的最优实现方案
你遇到的是JS引用类型赋值共享内存地址的问题,需要对原对象做拷贝来实现两个对象独立修改,根据你的对象结构可以选择不同的方案:
单层无嵌套对象(浅拷贝即可)
- 扩展运算符写法(ES6+支持,最简洁)
var a = {"color":"blue"}; var b = {...a}; a.color = "orange"; console.log(b.color); // 输出 blue
- Object.assign 写法(兼容性略优于扩展运算符)
var a = {"color":"blue"}; var b = Object.assign({}, a); a.color = "orange"; console.log(b.color); // 输出 blue
含嵌套的复杂对象(需要深拷贝)
- JSON序列化反序列化组合(仅适用无特殊类型的普通对象)
var a = {"color":"blue", "info": {"size": 10}}; var b = JSON.parse(JSON.stringify(a)); a.info.size = 20; console.log(b.info.size); // 输出 10
注意:该方案会丢失函数、Symbol、undefined类型的值,Date会被转为字符串,RegExp会被转为空对象,无法处理循环引用的对象
- structuredClone 原生API(现代浏览器/Node.js 17+支持,最优原生深拷贝方案)
var a = {"color":"blue", "info": {"size": 10}, createTime: new Date()}; var b = structuredClone(a); a.info.size = 20; console.log(b.info.size); // 输出 10 console.log(b.createTime instanceof Date); // 输出 true
该方案支持循环引用,能正确处理Date、RegExp、Map、Set等绝大多数内置类型,仅不支持函数、Symbol等极少数特殊类型。
如果你的场景需要兼容老旧环境,或是需要拷贝包含函数的特殊对象,可以自己实现递归遍历的深拷贝逻辑即可。
内容的提问来源于stack exchange,提问作者n w
相关产品推荐
相关产品推荐

