1

我认为这只是我不了解 JavaScript 工作原理的一部分。假设我有一个数组,调用它arr1,里面有 6 个整数, [1,2,3,4,5,6]。如果我创建一个新数组:

var arr2 = arr1

(为了保持不变的副本arr1),当我更改时arr1,更改会反映在arr2.

基本上,我在操纵arr1. 出于测试目的,我希望有一个未更改的副本,arr1这样当我完成后,我可以在我的网页上将它们都控制台记录下来并查看它们之间的差异。但同样,当我在 中进行更改时arr1,该更改会反映在arr2.

谁能解释为什么会发生这种情况以及可能的解决方法?我对为什么会发生这种情况比如何解决它更感兴趣。

一种方法是创建arr2一个单独的数组,并使用 for 循环来填充它arr1的数据

for(int i = 0; i < arr1.length; i++) arr2[i] = arr1[i]

但是,如果阵列很大,那可能会很昂贵。任何帮助表示赞赏。

4

3 回答 3

8

当您分配非基元(例如数组)时,您并没有制作副本。您正在创建对同一数组的另一个引用。

如果要复制数组:

var arr2 = arr1.slice();
// or
var arr2 = arr1.concat();

更多阅读:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array

于 2012-11-21T18:44:50.947 回答
3

对象通过引用而不是值传递。

要创建数组的副本,请尝试:

var arr2 = arr1.slice(0);
于 2012-11-21T18:44:50.200 回答
1

Javascript 通过引用处理数组,因此您的arr1arr2实际上指向同一个数组。

您可能想要做的是克隆阵列,您可以使用slice

var arr2 = arr1.slice(0);
于 2012-11-21T18:47:24.500 回答