临时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
相关产品推荐
相关产品推荐

