具有对象值的子属性是否在Javascript中通过引用复制?

具有对象值的子属性是否在Javascript中通过引用复制?,javascript,node.js,Javascript,Node.js,考虑以下代码: 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} } 因为对象是通过引用复制的,所以我希望子属性是通过引用复

考虑以下代码:

 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} }

因为对象是通过引用复制的,所以我希望子属性是通过引用复制的,因为我要指定为值的对象很大,并且不希望保留多个副本。

是的,对象是通过引用复制的。但是在
newprop2={m:65,n:25}行您正在为
newprop2
分配一个新对象。较旧的引用仍然分配给
A.prop2
,它引用了
newprop2
所引用的旧对象。因此,
newprop2
现在引用的是另一个对象,它与之前引用的对象已经没有任何关系

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

const A={
prop1:12,
prop2:{x:12}
};
设newprop2={k:55,l:3};
A.prop2=newprop2;
newprop2.k=65;
newprop2.l=25;

控制台日志(A)是,通过引用复制对象。但是在
newprop2={m:65,n:25}行您正在为
newprop2
分配一个新对象。较旧的引用仍然分配给
A.prop2
,它引用了
newprop2
所引用的旧对象。因此,
newprop2
现在引用的是另一个对象,它与之前引用的对象已经没有任何关系

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

const A={
prop1:12,
prop2:{x:12}
};
设newprop2={k:55,l:3};
A.prop2=newprop2;
newprop2.k=65;
newprop2.l=25;

控制台日志(A)是,因为它被
newprop2={k:55,l:3}引用。后来,您更改了
newprop2
的引用,但这是在作业完成之后,因此
A
prop2具有较旧的引用
newprop2
。在末尾
A.prop2!==newprop2
。一旦为
newprop2
指定了新值,就必须将值设置为属性
prop2
。因此,只需在新分配
prop2
之后分配
prop2
值即可

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

控制台日志(A)是,因为它被
newprop2={k:55,l:3}引用。后来,您更改了
newprop2
的引用,但这是在作业完成之后,因此
A
prop2具有较旧的引用
newprop2
。在末尾
A.prop2!==newprop2
。一旦为
newprop2
指定了新值,就必须将值设置为属性
prop2
。因此,只需在新分配
prop2
之后分配
prop2
值即可

A={
prop1:12,
prop2:{x:12}
};
newprop2={k:55,l:3};
newprop2={m:65,n:25};
A.prop2=newprop2;
控制台日志(A)