使用新值更新时出现阵列问题

时间:2013-11-26 06:26:47

标签: javascript arrays reference

收到一个我无法说明原因的问题,

声明变量var arr1 = [2, 3]; 然后复制到另一个变量var arr2 = arr1; 最后推arr2[0] = 1; 并且整个代码看起来像这样,

var arr1 = [2, 3];
var arr2 = arr1;
arr2[0] = 1;
console.log(arr1, arr2); 

我们期望的结果是[2, 3] [1, 3]但意外收到[1, 3] [1, 3],即数组值都已更新。

有人可以提一下为什么数组都会产生相同的值吗?

5 个答案:

答案 0 :(得分:4)

arr1和arr2是引用(类似于其他语言中的指针)。它们引用相同的Array对象。你基本上有两个指向同一容器的指针。

当你尝试获取这两个“指针”指向的容器的内容时​​,它们有意义地返回相同的值。

你可以使用slice:arr1.slice(0),这应该适用于大多数情况。

在某些情况下,你需要一个深层拷贝,这里提到了一个例子,当数组包含指向其他对象的指针时需要这个,因为你几乎得到了一个指向其他对象的指针数组,你需要一个更深的副本: http://james.padolsey.com/javascript/deep-copying-of-objects-and-arrays/

答案 1 :(得分:2)

使用slice

var arr1 = [2, 3];
var arr2 = arr1.slice(0);;
arr2[0] = 1;
console.log(arr1, arr2); 

slice(0)方法的意思是,将数组的一个片段从元素0返回到结尾。换句话说,整个阵列。 Voila,阵列的副本。这里要记住的唯一警告是,如果数组仅包含简单数据类型(如数字,字符串和布尔值),则此方法有效。如果数组包含对象或其他数组(多维数组),那么包含“对象”的数组将通过引用复制,保留与源数组的连接。在这种情况下,您需要将数组复制为完整的对象。

答案 2 :(得分:2)

要明确的是,当你这样做时:

var arr1 = [2, 3];

然后分配给 arr1 是对右侧数组的引用。当你这样做时:

var arr2 = arr1;

然后将 arr1 的值分配给 arr2 ,以便两个变量的值都是对同一个Array对象的引用。因此,当你这样做:

arr2[0] = 1;

您正在更改数组对象,因为 arr1 arr2 都引用相同的数组,您将得到:

console.log(arr1, arr2);  // [1,3], [1,3]

即。相同的数组记录了两次。

答案 3 :(得分:0)

如果要复制数组,请使用

var arr2 = arr1.slice(0);

否则你将指针传递给另一个var,它们指向同一个对象

答案 4 :(得分:0)

将值分配给arr2时,将分配该值的本地地址。当该地址的值发生变化时,它会反映在两个变量上。