有人可以向我解释一下这种行为吗?
const object1 = {
a: {
d : 1,
e : 4
},
b: 2,
c: 3
};
const object2 = Object.assign({}, object1);
console.log('object1 :', object1);
console.log('object2 :', object2);
delete object2.a;
console.log('object1 :', object1);
console.log('object2 :', object2);
如果我删除a
,则只有object2
受到影响。
> "object1 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object2 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object1 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object2 :" Object { b: 2, c: 3 }
如果我删除嵌套属性...
const object2 = Object.assign({}, object1);
console.log('object1 :', object1);
console.log('object2 :', object2);
delete object2.a.d;
console.log('object1 :', object1);
console.log('object2 :', object2);
object1
和 object2
都丢失了属性 d
。
> "object1 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object2 :" Object { a: Object { d: 1, e: 4 }, b: 2, c: 3 }
> "object1 :" Object { a: Object { e: 4 }, b: 2, c: 3 }
> "object2 :" Object { a: Object { e: 4 }, b: 2, c: 3 }
为什么?
最佳答案
分配文档中的示例部分 ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign ):
Warning for Deep Clone
For deep cloning, we need to use other alternatives because Object.assign() copies property values. If the source value is a reference to an object, it only copies that reference value.
有一个关于如何深度克隆对象的具体示例:
JSON.parse(JSON.stringify(obj1))
如果您想了解更多信息,有一个关于此问题的旧线程:
What is the most efficient way to deep clone an object in JavaScript?
关于javascript - 使用 Object.assign() 删除克隆对象的嵌套属性会影响原始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49359169/