JavaScript数组奇怪吗?

时间:2012-11-21 18:42:59

标签: javascript arrays

我认为这只是我不了解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]

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

3 个答案:

答案 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通过引用处理数组,因此arr1arr2实际上指向同一个数组。

您可能想要做的是克隆数组,您可以使用slice

来执行此操作
var arr2 = arr1.slice(0);