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

标签 javascript variable-assignment pass-by-reference

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

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

最佳答案

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

所以,当你这样做时:

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

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

如果你想分配一个副本,那么你实际上必须制作一个对象的副本(通过创建一个新对象,然后将所有属性从原始对象复制到新对象)并分配该新副本。

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

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

关于Javascript: array1[0] = array2[0];这是按值传递还是按引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22889833/

相关文章:

Javascript 变量作为对象指针

javascript - 变量/对象是按值传递的吗?为什么我不能用 JavaScript 中的变量更改对象的属性?

javascript - Vert.x 相当于 Node.js 全局对象

javascript - Bootstrap 日期选择器未显示

c++ - 对象指针赋值的指针 vector 的一个元素

postgresql - PL/pgSQL 函数中的动态 SELECT INTO

c# - C# 赋值变量时的异常处理

c++ - 对默认参数使用右值引用

javascript - get_browser 不适用于 PHP 中的 IF 语句

javascript - 允许 JavaScript 正则表达式中的换行符