考虑以下代码:
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);