3

当我创建一个对象并将其推送到数组时,它是通过引用还是值存储?

我看到以下情况发生:

var abc = { a: 10, b: 20};
var def = [];
def.push(abc);

abc.a = 100;

def[0].a; // outputs 100!

// if I do this
abc = { a: 10000, b: 20000 };

def[0].a; // still 100, no change this time

来自控制台的图像:

来自控制台的图像

如果我使用=符号将对象分配给,则数组中abc指向的引用也应该改变,不是吗?我们在上面通过价值还是通过引用来称呼什么?abcdef

我理解它就像是abc指向一个值的引用。只要我们不使用=符号,它就会一直指向那个。请指导。

4

4 回答 4

8

让我们来看看发生了什么:

var abc = { a: 10, b: 20};

一个新对象在内存中创建并分配给变量abc

var def = [];

在内存中创建一个新数组并分配给变量def

def.push(abc);

在数组内部现在有一个指向以前创建的对象的指针。

 abc.a = 100;

 def[0].a; // outputs 100!

显然是对的。我们正在修改对象,该对象也被数组引用。

 abc = { a: 10000, b: 20000 };

再次创建了一个新对象,并且对它的引用存储在abc. 现在我们在内存中有两个对象(和一个数组)。

 def[0].a; // still 100, no change this time

当然,这仍然是100。数组指针仍然引用第一个创建的对象,而不是第二个。

于 2013-06-27T11:42:47.597 回答
7

对象总是通过引用传递。

当您编写abc = { a: 10000, b: 20000 }时,您要覆盖的是变量 abc,它指向旧对象,但现在指向新对象。

于 2013-06-27T11:40:16.050 回答
0

正如你所说create an object,那么你正在处理参考资料。

在您的第二个语句中abc = { a: 10000, b: 20000 };,您实际上所做的只是将变量abc品脱添加到新对象中,使其引用旧对象以外的其他内容abc

于 2013-06-27T11:42:19.200 回答
-3

问题的原因是当您将对象推送到数组时,它会自我克隆。我的意思是在数组中有一个对象的克隆。因此,如果您更改对象的属性,则不会发生任何变化。因为你已经有 2 个对象了。如果你想覆盖它,你可以在用新值定义 abc 之后使用 def[0] = abc 。除了你不能在不指定的情况下更改值

于 2013-06-27T11:47:44.677 回答