我认为这只是我不了解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]
但是,如果阵列很大,那可能会很昂贵。任何帮助表示赞赏。
答案 0 :(得分:8)
当您指定非基元(例如数组)时,您没有复制。您正在创建对同一数组的另一个引用。
如果你想复制一个数组:
var arr2 = arr1.slice();
// or
var arr2 = arr1.concat();
更多阅读:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array
答案 1 :(得分:3)
对象通过引用传递,而不是通过值传递。
要创建数组的副本,请尝试:
var arr2 = arr1.slice(0);
答案 2 :(得分:1)
Javascript通过引用处理数组,因此arr1
和arr2
实际上指向同一个数组。
您可能想要做的是克隆数组,您可以使用slice
var arr2 = arr1.slice(0);