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

JavaScript在数组中推送对象是什么-通过引用还是通过值?,javascript,coding-style,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 var abc = { a: 10

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

我看到以下情况:

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
var abc = { a: 10, b: 20};
控制台中的图像:

如果我使用
=
符号将对象分配给
abc
,则数组
def
中由
abc
指向的引用也应该更改,不是吗?。上面我们称之为什么,通过值还是通过引用


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

对象始终通过引用传递


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

正如你所说的
创建一个对象
,这样你就可以处理引用了


在你的第二句话中,
abc={a:10000,b:20000}您实际做的只是将变量
abc
pints放入新对象,使其引用旧的
abc

让我们看看发生了什么:

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
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个对象了。如果要覆盖它,必须在用新值定义abc之后使用def[0]=abc。除了这样一个事实,即您不能在不指定它的情况下更改值

更改一个对象的属性,您将看到。如果另一个对象也发生更改,则它们都引用同一个对象。否则它们就是副本。当然,分配给abc的是一个新对象,但这并不是说通过引用传递对象。那么
abc
内部
def
会发生什么呢。似乎
def
刚好有
abc
所指的值。那么我们可以称之为传递值吗?非常详细的分解过程!1.从第一个答案来看,似乎数组内部有值而不是指针,而该值由
abc
指向外部。2.该对象不是由数组引用的,而是由literal
abc
引用的。因此,如果
abc
失去其指向性,我们就不能从外部修改arraybtw中的对象,我没有投反对票。我仍然对间接参考和价值感到困惑。有好的资源吗?@OmShankar pass by value意味着您只需创建数据的新副本,而pass by reference意味着您只复制引用同一对象的数据指针(内存地址)heap@OmShankar就像第一个答案中提到的,对象只是被引用的。因此,如果您为
abc
指定一个新值,旧的引用将被覆盖,但实际对象不会被覆盖。如果存在对该对象的任何其他引用,它们将保留。如果没有对旧对象的引用,它将由垃圾收集处理。您显然不理解值和引用类型之间的区别…为什么这样认为?我的意思是数组中没有指向point对象的指针。数组中有新对象。当然,这可能是错误的,只是在堆上保持指向相同对象引用的指针,通过将abc对象推入def数组,您只需创建引用相同对象的指针的新副本,我尝试解释相同的事情。我也喜欢你