收到一个我无法说明原因的问题,
声明变量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]
,即数组值都已更新。
有人可以提一下为什么数组都会产生相同的值吗?
答案 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时,将分配该值的本地地址。当该地址的值发生变化时,它会反映在两个变量上。