【发布时间】:2019-02-22 20:48:34
【问题描述】:
我希望了解将对象推入数组时的以下行为。
(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?),但没有得到令人满意的解释。
【问题讨论】:
-
因为它是参考,而不是副本
-
您能否具体说明一下您所指的解释不满意的地方?
-
你不是自己解释的吗? 2a 修改变量和数组引用的对象,2b 创建第二个对象并仅修改它。
-
数组中仍然引用了第一个对象。该引用作为 obj 被推送到数组中。当 obj 引用一个新对象时,那个原始引用是什么?
-
原始引用仍然引用原始对象。一个对象不需要有任何类型的“为它分配空间的变量”就可以存在。如果您来自低级语言:每个 对象只是一个指针。对象字面量
{}在堆上创建动态对象并返回对它的引用。
标签: javascript arrays reference