使用新值更新时出现数组问题

Array issue when updating with new values

本文关键字:数组 问题 新值 更新      更新时间:2023-10-19

收到一个问题,我无法给出原因,

声明了一个变量var arr1 = [2, 3];然后复制到另一个变量CCD_ 2最后推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],即两个数组值都更新了。

有人能提到为什么两个数组的结果都是相同的值吗?

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

当您尝试获取这两个"指针"所指向的容器的内容时,它们返回相同的值是有意义的。

您可以使用slice:arr1.slice(0),如前所述,这应该适用于大多数情况。

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

使用slice:

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

slice(0)方法的意思是,从元素0到末尾返回数组的一个切片。换句话说,就是整个数组。沃伊拉,阵列的副本。这里唯一需要记住的是,如果数组只包含简单的数据类型,如数字、字符串和布尔值,则此方法有效。如果数组包含对象或其他数组(多维数组),则这些包含的"对象"将通过引用进行复制,从而保留与源数组的连接。在这种情况下,您需要将数组复制为一个完整的对象。

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

var arr1 = [2, 3];

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

var arr2 = arr1;

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

arr2[0] = 1;

您正在更改数组对象,由于arr1AR2都引用相同的数组,因此您得到:

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

即同一阵列记录两次。

如果您想复制数组,请使用

var arr2 = arr1.slice(0);

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

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