当将对象推入数组时,我希望了解以下行为。
(1)创建对象,创建对象的属性,然后将其推到数组中。
var array = [];
var obj = {};
obj.x = 1;
array.push(obj);
console.log(array); //Output [{x: 1}]
考虑以下两种备选方案:
(2a):我更改对象的属性,从而更改数组中引用的对象:
obj.x = 2;
console.log(array); //Output [{x: 2}] ... it has been changed
(2b而不是2a)我让对象引用引用一个新对象并创建属性,数组中引用的原始对象不变:
obj = {}; //Change reference to new object
obj.x = 2;
console.log(array); //Output [{x: 1}] ... it is unchanged
为什么是这种情况?
P.S:我注意到这里讨论了这个区别(Do objects pushed into an array in javascript deep or shallow copy?),但解释得并不令人满意。
发布于 2018-09-18 19:19:53
我不知道我可怜的ASCII图表技巧是否会有帮助,但下面是一个尝试:
-----------------------------------------
(1)
-----------------------------------------
array = []
[ ] 'array'
^--------/
obj = {}
[ ] 'array' { } 'obj'
^--------/ ^-------/
obj.x = 1
[ ] 'array' {x: 1} 'obj'
^--------/ ^---------/
array.push(obj)
,-----------------v
[0: * ] 'array' {x: 1} 'obj'
^------------/ ^---------/
-----------------------------------------
(2a)
-----------------------------------------
obj.x = 2
,-----------------v
[0: * ] 'array' {x: 2} 'obj'
^------------/ ^---------/
-----------------------------------------
(2b)
-----------------------------------------
obj = {}
,-----------------v
[0: * ] 'array' {x: 1} 'obj' { }
^------------/ `-------^
obj.x = 2
,-----------------v
[0: * ] 'array' {x: 1} 'obj' {x: 2}
^------------/ `--------^
发布于 2018-09-18 18:58:44
通过对象引用将JavaScript对象推入数组,也就是说,如果将对象推入数组,然后操作对象,则数组的内容似乎也会发生变化,因为数组引用相同的对象。
通过初始化或克隆附加步骤创建一个新对象,数组中有两个完全不同的对象。
可以这样想:当调用对象上的push
时,对象本身不会进入数组,对对象的引用(指针)就会进入。原始类型(如数字)被复制,对象不被复制。
https://stackoverflow.com/questions/52392962
复制相似问题