具有对象值的子属性是否在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)代码>