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.该对象不是由数组引用的,而是由literalabc
引用的。因此,如果abc
失去其指向性,我们就不能从外部修改arraybtw中的对象,我没有投反对票。我仍然对间接参考和价值感到困惑。有好的资源吗?@OmShankar pass by value意味着您只需创建数据的新副本,而pass by reference意味着您只复制引用同一对象的数据指针(内存地址)heap@OmShankar就像第一个答案中提到的,对象只是被引用的。因此,如果您为abc
指定一个新值,旧的引用将被覆盖,但实际对象不会被覆盖。如果存在对该对象的任何其他引用,它们将保留。如果没有对旧对象的引用,它将由垃圾收集处理。您显然不理解值和引用类型之间的区别…为什么这样认为?我的意思是数组中没有指向point对象的指针。数组中有新对象。当然,这可能是错误的,只是在堆上保持指向相同对象引用的指针,通过将abc对象推入def数组,您只需创建引用相同对象的指针的新副本,我尝试解释相同的事情。我也喜欢你