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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:25:30