推送数组中的对象的JavaScript是什么 - 通过引用或值?

时间:2013-06-27 11:38:28

标签: javascript coding-style

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

我看到以下情况发生了:

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

来自控制台的图片:

Image from console

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

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

4 个答案:

答案 0 :(得分:7)

对象总是通过引用传递。

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

答案 1 :(得分:7)

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

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。数组指针仍然引用第一个创建的对象,而不是第二个。

答案 2 :(得分:0)

正如你所说的那样create an object所以你正在处理引用。

在你的第二个陈述abc = { a: 10000, b: 20000 };中你实际做的只是将变量abc品牌添加到新对象中,使其引用除旧abc之外的其他内容

答案 3 :(得分:-3)

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