Javascript 对象复制 [复制]

Javascript object copy [duplicate]

提问人:Marcelo Alarcon 提问时间:1/14/2023 更新时间:1/14/2023 访问量:37

问:

我想了解为什么当我制作对象的副本并重新分配 obj2(副本)中的“nestedObject”属性时,仅在 obj2(副本)中修改,而不是在原始对象中修改。但是,当重新赋值属性 foo2 时,新值将分配给这两个对象。

let obj1 = {
  foo1: 1,
  nestedObj: {
    foo2: 2
  }
}

let obj2 = obj1

console.log(obj1);
console.log(obj2);
// { foo1: 1, nestedObj: { foo2: 2 } }
// { foo1: 1, nestedObj: { foo2: 2 } }

obj2 = obj2.nestedObj;

console.log(obj1);
console.log(obj2);
// { foo1: 1, nestedObj: { foo2: 2 } }
// { foo2: 2 }

obj2.foo2 = 3

console.log(obj1);
console.log(obj2);
// { foo1: 1, nestedObj: { foo2: 3 } }
// { foo2: 3 }

我假设区别在于按值复制或按引用复制时。但我自己还没能弄清楚。 非常感谢您的回复和时间。

我想了解为什么当我制作对象的副本并重新分配 obj2(副本)中的“nestedObject”属性时,仅在 obj2(副本)中修改,而不是在原始对象中修改。但是,当重新赋值属性 foo2 时,新值将分配给这两个对象。

JavaScript JSON 对象 按引用传递

评论

0赞 jsejcksn 1/14/2023
将对象分配给变量/属性始终会创建引用。复制对象可能非常复杂,并且可能是一项艰巨的挑战。请参阅 structuredClone API。
0赞 deceze 1/14/2023
最好的办法可能是在 pythontutor.com 上想象这一点。
0赞 jsejcksn 1/14/2023
^@deceze 可视化调试器是一个很棒的教学工具!谢谢!
0赞 Tibrogargan 1/14/2023
Смотритетакже: JavaScript 是按引用传递还是按值传递语言

答: 暂无答案