考虑以下代码:

 A={
  prop1: 12,
  prop2: {x:12}
 };
 newprop2={k:55,l:3};
 A.prop2=newprop2;
 newprop2 = {m:65, n:25};
 console.log(A);


输出为:

  { prop1: 12, prop2: { k: 55, l: 3 } }


我期望输出为:

  { prop1: 12, prop2: {m:65, n:25} }


因为对象是通过引用复制的,所以我希望子属性是通过引用复制的,因为我想要分配为值的对象是LARGE,并且不想维护多个副本。

最佳答案

是的,对象是通过引用复制的。但是在newprop2 = {m:65, n:25};行中,您正在为newprop2分配一个新对象。较旧的引用仍被分配给A.prop2,它引用newprop2所引用的旧对象。因此,newprop2现在引用另一个对象,该对象与其之前引用的对象已经不存在。

简而言之,您已更改了newprop2的引用。如果将通过newprop2访问属性,而不更改引用,则将对A.prop2引用的同一对象进行突变。



const A = {
  prop1: 12,
  prop2: { x: 12 }
};

let newprop2 = { k:55, l:3 };
A.prop2 = newprop2;

newprop2.k = 65;
newprop2.l = 25;

console.log(A);

08-27 18:39