【问题标题】:Javascript: array1[0] = array2[0]; does this pass by value or by reference?Javascript:array1[0] = array2[0];这是按值传递还是通过引用传递?
【发布时间】:2014-05-18 08:42:36
【问题描述】:
this.lastLocations[0] = this.locations[0];
this.locations[0].x++;

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

【问题讨论】:

  • oo 明白了。仍在学习堆栈溢出机制和礼仪。

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


【解决方案1】:

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

【讨论】:

  • @SUCHANOOB - 请参阅我在答案中添加的关于复制对象的方法的参考资料。
【解决方案2】:

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

“对象”不是 JavaScript 中的值。 JavaScript 中唯一的值是原语和引用(指向对象的指针)。所以array1[0] 要么是基元,要么是指向对象的指针,array2[0] 要么是基元,要么是指向对象的指针。

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

【讨论】:

  • 嗯,不是反对者,但这是一种非常令人困惑的解释方式。
  • @BenjaminGruenbaum:这是正确的解释方式。
  • 嗯...公平地说,我不想这么说 - 但它真的不正确。此答案中有许多术语不准确。您应该真正查阅规范 - 即 es5.github.io/#x8.7 关于对象值、参考等的术语。 JavaScript 中根本不存在指针(没有引用运算符、解引用运算符、指针算术等),JavaScript 是通过引用值传递的。
  • @BenjaminGruenbaum:那么规格说明了什么?语义描述仅在跨语言一致的情况下才有用。 JavaScript 中传递和赋值的语义与 Java 和许多其他语言完全相同,其中非基元是“引用”,而引用被定义为“指向对象的指针”,这与 C++ 中的调用方式一致.
猜你喜欢
  • 2012-03-20
  • 1970-01-01
  • 2015-01-12
  • 2020-04-01
  • 1970-01-01
  • 2019-04-04
  • 2016-11-28
  • 2017-11-14
相关资源
最近更新 更多