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

如何分离引用同一对象的数组?修改新数组时原数组同步变更问题

解决JavaScript数组对象引用导致原数组被修改的问题

你猜的完全没错!问题的核心就是对象的引用特性——在JavaScript里,对象属于引用类型,当你直接把原数组里的对象赋值给tmp时,并没有创建一个全新的对象,只是让tmp指向了原对象在内存中的同一个地址。所以你修改tmp.age的时候,本质上是在修改原数组里的那个对象,原数组自然会跟着同步变化。

要彻底分离这两个数组,你需要为每个符合条件的对象创建一个独立的副本,而不是直接引用原对象。因为你的对象只有一层属性(仅包含age),用浅拷贝就足够解决问题,下面给你几种实用的方案:

方案1:使用对象展开运算符(推荐,简洁直观)

通过{...array[i]}语法,可以快速复制原对象的所有属性,生成一个全新的独立对象:

var arr = [ {age:23}, {age:25}, {age:24}, {age:30}, {age:33}, {age:24}, {age:56}, {age:13} ];
var over30 = [];
const f = (array) =>{
 for(let i = 0 ; i<array.length; i++){
  if(array[i].age >= 30){
   // 生成原对象的副本,而非引用
   let tmp = {...array[i]};
   tmp.age +=1;
   over30.push(tmp);
  }
 }
};
f(arr);
console.log(arr); // 原数组完全保留原始状态
console.log(over30); // 新数组中的对象age都已+1,且不影响原数组

方案2:使用Object.assign()方法

Object.assign()方法可以将源对象的属性复制到目标对象,这里我们用空对象作为目标,实现对象的浅拷贝:

let tmp = Object.assign({}, array[i]);

把这行代码替换方案1中的let tmp = {...array[i]},可以达到完全相同的效果。

补充:如果遇到嵌套对象怎么办?

如果你的对象是多层嵌套结构(比如{age:30, info: {name: '张三'}}),上面的浅拷贝就无法彻底分离引用了——嵌套的子对象依然会指向原内存地址。这时候需要用到深拷贝,比如可以自己编写递归拷贝函数,或者使用JSON.parse(JSON.stringify(array[i]))(注意:这个方法无法处理函数、Symbol等特殊类型,使用时需要注意场景)。

现在运行修改后的代码,你会发现原数组的原始状态被完美保留,新数组的任何修改都不会再影响到它了!

内容的提问来源于stack exchange,提问作者youngho Park

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:17:27