Javascript:array1 [0] = array2 [0];这是通过价值还是通过参考?

时间:2014-04-06 03:59:48

标签: javascript variable-assignment pass-by-reference

this.lastLocations[0] = this.locations[0];
this.locations[0].x++;

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

2 个答案:

答案 0 :(得分:3)

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

所以,当你这样做时:

this.lastLocations[0] = this.locations[0];

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

如果要分配副本,则必须复制该对象(通过创建新对象,然后将所有属性从原始对象复制到新对象)并分配该新副本。 / p>

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

What is the most efficient way to deep clone an object in JavaScript?

How do I correctly clone a JavaScript object?

is it possible in Javascript to tell an object to stop having reference behavior with another object

以及其他一些相关问题:

Do objects pushed into an array in javascript deep or shallow copy?

Javascript by reference vs. by value

答案 1 :(得分:0)

JavaScript中的所有内容都会通过并按值分配

"对象"不是JavaScript中的值。 JavaScript中唯一的值是基元和引用(指向对象的指针)。所以array1[0]是一个原语或指向对象的指针,而array2[0]是一个原语或指向对象的指针。

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