Javascript:array1[0]=array2[0];这是通过值传递还是通过引用传递?

Javascript:array1[0]=array2[0];这是通过值传递还是通过引用传递?,javascript,variable-assignment,pass-by-reference,Javascript,Variable Assignment,Pass By Reference,执行此代码时,它同时递增位置[0].x和最后位置[0].x。我希望它只更改位置[0].x。这是因为javascript分配的是引用而不是值吗?或者问题在我的代码中的其他地方?javascript中的对象是通过引用分配的,因此两个变量都指向完全相同的对象 因此,当您这样做时: this.lastLocations[0] = this.locations[0]; this.locations[0].x++; 然后,this.lastLocations[0]和this.locations[0]现在都

执行此代码时,它同时递增位置[0].x和最后位置[0].x。我希望它只更改位置[0].x。这是因为javascript分配的是引用而不是值吗?或者问题在我的代码中的其他地方?

javascript中的对象是通过引用分配的,因此两个变量都指向完全相同的对象

因此,当您这样做时:

this.lastLocations[0] = this.locations[0];
this.locations[0].x++;
然后,
this.lastLocations[0]
this.locations[0]
现在都指向完全相同的对象。如果通过其中一个变量对该对象进行更改,则该更改将通过另一个变量显示(因为它们都指向完全相同的对象)

如果要指定副本,则必须创建对象的副本(通过创建新对象,然后将所有属性从原始对象复制到新对象),并指定新副本

关于克隆/复制对象的方法,还有许多其他帖子:

以及其他一些相关问题:


JavaScript中的所有内容都是通过值传递和分配的

“对象”不是JavaScript中的值。JavaScript中唯一的值是原语和引用(指向对象的指针)。因此,
array1[0]
是一个原语或指向对象的指针,
array2[0]
是一个原语或指向对象的指针


当您执行
array1[0]=array2[0]
操作时,它会指定对象指针,以便两个指针指向同一个对象。

@SUCHANOOB-请参阅我在回答中添加的有关如何制作对象副本的参考资料。oo明白了。仍在学习堆栈溢出机制和礼仪。呃,不是向下的投票者,但这是一种非常令人困惑的解释方式。@BenjaminGruenbaum:这是正确的解释方式。嗯。。。说句公道话,我本不想这么说,但事实并非如此。这个答案中有许多术语不准确。您真的应该参考规范,即关于对象值、引用等的术语。JavaScript中根本不存在指针(无引用运算符、解引用运算符、指针算术等),JavaScript是按引用值传递的。@BenjaminGruenbaum:那么规范怎么说?语义描述只有在跨语言一致的情况下才有用。JavaScript中传递和赋值的语义与java和许多其他语言完全相同,其中非原语是“引用”,引用被定义为“指向对象的指针”,这与C++中如何调用它是一致的。
this.lastLocations[0] = this.locations[0];