2
var array = [];
var arr = [];
var i;
for (i = 0; i < 2; i++) {
    var temp = [];// using array[i] = new Array() works fine
    array.push(temp);
    arr.push(temp);
}
array[0].push(1);
arr[0].push(2);
alert(array[0]);

上面的 javascript 代码给出了 [1,2] 作为输出。使用' new Array() '而不是' push([]) '给出[1]。我能够找到问题,但我不明白为什么。有人可以解释一下吗

4

2 回答 2

2

数组的工作方式就像指向内存中某个位置的指针,因此 arr 变量存储了你推送的实际值,实际上它指向存储值的内存位置,在这种情况下它指向“temp”,所以当你写

for (i = 0; i < 2; i++) {
  var temp = [];// using array[i] = new Array() works fine
  array.push(temp);
  arr.push(temp);
}

发生的事情是,在每个循环中它创建一个新的临时,但是“array an arr”都指向内存中的相同位置,因此当其中一个正在修改该位置的内容时,它会更改另一个的数据指向

同时如果使用以下代码

var array = [];
var arr = [];
var i;
for (i = 0; i < 2; i++) {
  array[i] = new Array();
  arr[i] = new Array();

}
array[0].push(1);
arr[0].push(2);
alert(array[0])

这里会发生的是,每次调用“new Array()”时,它都会在内存中分配一个新变量并将其位置传回给您创建的数组指针“array & arr”,所以现在每个previos 指针指向内存中的不同位置

于 2013-07-13T10:44:23.777 回答
1

此代码将创建一个数组并将对它的引用放在数组和 arr 中

var temp = [];// using array[i] = new Array() works fine
array.push(temp);
arr.push(temp);

所以当你运行时:

array[0].push(1);
arr[0].push(2);
alert(array[0]);

然后,您首先将 1 推送到原始 tmp,它在数组 [0] 中具有引用,然后再次将 2 推送到 tmp,这也在 arr[0] 中,因此您将得到 [1,2]。

我没有看到你的完整替代代码,但我假设你的 for 循环中有这个:

array[i] = new Array();
arr[i] = new Array();

然后,您将在 array 和 arr 中有两个单独的数组,因此当您再次运行时:

array[0].push(1);
arr[0].push(2);
alert(array[0]);
alert(arr[0]);

您将在数组 [0] 中获得 1,在数组 [1] 中获得 2。

于 2013-07-13T10:20:08.450 回答