变量赋值 - Javascript: array1[0] = array2[0];这是按值传递还是按引用传递

variable assignment - Javascript: array1[0] = array2[0]; does this pass by value or by reference?

本文关键字:赋值 按值传递 按引用传递 array2 Javascript array1 变量      更新时间:2023-09-26
this.lastLocations[0] = this.locations[0];
this.locations[0].x++;

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

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

因此,当您执行此操作时:

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

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

如果要分配副本,

则必须创建对象的副本(通过创建一个新对象,然后将所有属性从原始对象复制到新对象)并分配该新副本。

还有许多其他关于克隆/复制对象方法的文章:

在 JavaScript 中深度克隆对象的最有效方法是什么?

如何正确克隆 JavaScript 对象?

在 Javascript 中是否有可能告诉一个对象停止对另一个对象的引用行为

以及一些其他相关问题:

对象是推送到 javascript 中的数组中,是深拷贝还是浅拷贝?

Javascript 按引用与按值

JavaScript 中的所有内容都是按值传递和赋值的。

"对象"不是 JavaScript 中的值。JavaScript 中唯一的值是基元和引用(指向对象的指针)。因此,array1[0]要么是基元,要么是指向对象的指针,array2[0]要么是基元,要么是指向对象的指针。

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