如何在JavaScript中复制对象并修改副本值而不影响原对象?
解决JavaScript对象数组拷贝后修改副本影响原数组的问题
直接执行b = a只是引用传递——a和b指向同一个数组内存地址,数组内的对象同样是引用类型,所以修改b的对象属性会同步影响原数组a。要实现修改副本不影响原数组,需要对数组及内部对象做深拷贝,以下是几种可行方案:
方案1:使用map+对象展开运算符(推荐简单场景)
通过map遍历数组,对每个对象用展开运算符{...item}创建新对象,确保每个元素都是独立引用:
const a = []; a[0] = { milk: "Malted" }; a[1] = { milk: "Goats" }; const b = a.map(item => ({ ...item })); b[0].milk = "Semi"; document.write(a[0].milk + " * " + b[0].milk); // 输出 Malted * Semi
方案2:JSON序列化反序列化(适合无特殊类型的对象)
将数组转成JSON字符串再解析,生成全新的数组和对象,但注意会忽略函数、undefined、Symbol等特殊类型:
const a = []; a[0] = { milk: "Malted" }; a[1] = { milk: "Goats" }; const b = JSON.parse(JSON.stringify(a)); b[0].milk = "Semi"; document.write(a[0].milk + " * " + b[0].milk); // 输出 Malted * Semi
方案3:自定义递归深拷贝函数(复杂场景)
如果对象层级更深或包含特殊类型,可写递归函数处理所有引用类型:
function deepClone(obj) { if (obj === null || typeof obj !== 'object') return obj; // 处理数组 if (Array.isArray(obj)) { return obj.map(item => deepClone(item)); } // 处理普通对象 const newObj = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = deepClone(obj[key]); } } return newObj; } const a = []; a[0] = { milk: "Malted" }; a[1] = { milk: "Goats" }; const b = deepClone(a); b[0].milk = "Semi"; document.write(a[0].milk + " * " + b[0].milk); // 输出 Malted * Semi
内容的提问来源于stack exchange,提问作者Flash20
相关产品推荐
相关产品推荐

