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

临时JSON变量赋值后修改致原JSON变更的问题求助

解决JSON对象修改临时变量导致原对象变更的问题

你碰到的这个问题其实是JavaScript里对象引用传递的典型坑——当你直接把count赋值给temp时,并没有真正复制出一份独立的新对象,只是让temp和count共享了内存里的同一个对象引用。所以你修改temp的属性时,本质上是在操作那个共享的对象,count自然会跟着一起变。

下面给你几种实用的解决办法,根据你的对象结构选就行:

方法1:JSON.parse() + JSON.stringify()(最通用的简单方案)

如果你的对象是标准JSON格式(没有函数、Symbol、循环引用这类特殊内容),这个方法最省心:

// 假设你的原对象是count
const count = { passed: 10, failed: 2 };
// 深拷贝得到完全独立的temp
const temp = JSON.parse(JSON.stringify(count));

// 现在随便改temp,count根本不会受影响
temp.passed = 20;
console.log(count.passed); // 输出10,还是原来的数值

⚠️ 注意:这个方法没法处理包含函数、Symbol、循环引用的对象,如果你的对象有这些类型,得换别的方法。

方法2:展开运算符...(适合单层结构对象)

如果你的JSON对象是单层的(没有嵌套的子对象),用展开运算符非常简洁:

const count = { passed: 10, failed: 2 };
const temp = { ...count };

temp.passed = 20;
console.log(count.passed); // 10,完全不受影响

要是对象有多层嵌套,展开运算符只能做浅拷贝(内层对象还是共享引用),这时候就得用递归或者其他深拷贝方式了。

方法3:Object.assign()(和展开运算符效果类似)

和展开运算符一样,适合单层对象的拷贝:

const count = { passed: 10, failed: 2 };
const temp = Object.assign({}, count);

temp.passed = 20;
console.log(count.passed); // 10

同样,多层嵌套的话需要结合递归处理。

方法4:递归实现深拷贝(适配复杂嵌套对象)

如果你的对象有多层嵌套,或者包含特殊类型,可以自己写一个递归的深拷贝函数:

function deepCopy(obj) {
  // 如果是原始类型或者null,直接返回
  if (obj === null || typeof obj !== 'object') return obj;
  // 处理数组类型
  if (obj instanceof Array) {
    return obj.map(item => deepCopy(item));
  }
  // 处理普通对象
  const copiedObj = {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      copiedObj[key] = deepCopy(obj[key]);
    }
  }
  return copiedObj;
}

// 使用示例
const count = { passed: 10, details: { failed: 2 } };
const temp = deepCopy(count);
temp.details.failed = 5;
console.log(count.details.failed); // 还是2,完全不受影响

总结一下:普通JSON场景用JSON.parse(JSON.stringify())就够了;复杂嵌套或特殊类型的对象,用递归深拷贝或者第三方库(比如Lodash的_.cloneDeep(),不想加库就自己写递归)都可以。

内容的提问来源于stack exchange,提问作者9094SS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:20:08