通过引用更新嵌套对象
Update nested object by reference
考虑这个例子:
这对我来说是预期的行为,一旦我们更改对象值,originalObj
也会发生突变。
现在考虑这个例子(嵌套对象):
如您所见,对象尚未更新。
即使反过来也行不通(更新原始对象不会改变引用):
为什么会发生这种情况,我该如何避免?
没有对基本类型的引用,正在复制值。
如果需要引用,将这个值包裹在一个对象中并指向该对象
在JavaScript中,事物是按值传递的。在您的初始代码中:
var ref = originalObj;
originalObj
的 值 已复制到 ref
。该值是对对象的 引用 ,因此两个变量都有该引用的独立副本,但它们都引用相同的底层对象。对象的变化反映在两个变量中。
在此:
var fooRef = originalObj.foo;
再次复制 originalObj.foo
的值,但这次该值只是一个数字 1
。此时,变量和 属性 具有该值的独立副本,但它只是一个数字,而不是对对象的引用。其中任何一个的变化都不会反映在另一个中。
how can I circumvent it?
通过使用您的第一个代码块 - 您需要对包含要更新的 属性 的对象的引用 - 您无法更新变量或直接通过保留 属性 reference/pointer 到它。
考虑这个例子:
这对我来说是预期的行为,一旦我们更改对象值,originalObj
也会发生突变。
现在考虑这个例子(嵌套对象):
如您所见,对象尚未更新。
即使反过来也行不通(更新原始对象不会改变引用):
为什么会发生这种情况,我该如何避免?
没有对基本类型的引用,正在复制值。 如果需要引用,将这个值包裹在一个对象中并指向该对象
在JavaScript中,事物是按值传递的。在您的初始代码中:
var ref = originalObj;
originalObj
的 值 已复制到 ref
。该值是对对象的 引用 ,因此两个变量都有该引用的独立副本,但它们都引用相同的底层对象。对象的变化反映在两个变量中。
在此:
var fooRef = originalObj.foo;
再次复制 originalObj.foo
的值,但这次该值只是一个数字 1
。此时,变量和 属性 具有该值的独立副本,但它只是一个数字,而不是对对象的引用。其中任何一个的变化都不会反映在另一个中。
how can I circumvent it?
通过使用您的第一个代码块 - 您需要对包含要更新的 属性 的对象的引用 - 您无法更新变量或直接通过保留 属性 reference/pointer 到它。