当我创建一个对象并将其推送到一个数组时,它是通过引用还是值存储的?
我看到以下情况发生了:
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
,则数组abc
中def
指向的引用也应该更改,不是吗? 。我们在上面,通过价值或参考来称呼什么?
我理解它像abc
是指向值的引用。只要我们不使用=
符号,它就会一直指向它。请指导。
答案 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。除非您不能在不指定值的情况下更改值