Javascript 2D数组生成,“奇怪”的行为

时间:2014-03-09 21:57:09

标签: javascript arrays

所以基本上我之前就同一个主题问了一个similar question,虽然我明白答案中的解决方案是如何以及为什么起作用的(我很欣赏),但我无法理解我的原因。代码不起作用。因此,该程序旨在生成一个二维数组,它应该复制一个乘法表。然而,行'值重复,而不是适当地不同。

基本上,它产生了     [[3,6,9],       [3,6,9],       [3,6,9]而不是预期的[[1,2,3],       [2,4,6],       [3,6,9]]。在阵列"行"之后,显然会发生这种情况。 (对应于由外环分配的arr2)被分配,在循环的下一次重复中,不仅当前元素arr [j]受到影响,而且前面的元素也在更新(更改)的值之后被更改/更新arr2,即使没有(明确地?)寻址和重新分配。

警告语句证明了这一点,其中相同的索引元素在不同的循环中具有不同的值,即使它们应该被分配一次而不是因此被分配后更改(至少据我所知,因为它们仅被分配/索引一次for循环)。那么为什么在这种情况下会发生这种行为呢?

以下代码:

<script>
    var arr = [];
    var arr2 =[];

    for (var j=0; j < 3; j++){
        for (var k=0; k<3; k++){
            arr2[k] = (k+1)*(j+1);
        }
        arr[j]=arr2;
        alert("arr[" + j + "]= " + arr[j]);
        alert("arr[" + (j-1) + "]= " + arr[j-1]);
    }

    alert("Finally: " + arr);
</script>

2 个答案:

答案 0 :(得分:3)

您已使用此行在arr2循环之外声明for

var arr2 = [];

这意味着每次运行此代码时:

for (var k = 0; k < 3; k++) {
  arr2[k] = (k + 1) * (j + 1);
}

...您只是替换arr2相同实例中的值。

这一行:

arr[j] = arr2;

...正在将引用存储到arr2的一个实例,而不是它的副本。因此,每次更改arr2时,arr中对它的每次引用都会发生变化。

答案 1 :(得分:0)

尝试以下方法:

var arr = [], // the array to hold the answer
    arr2, // another variable for inner array, note reset in loop below
    j, // declaring this outside of loop for better style
    k;

for (j=0; j < 3; j++){
    arr2 = []; // clear inner array each time
    for (k=0; k < 3; k++){
        arr2[k] = (j + 1) * (k + 1); // build inner array
    }
    arr[j] = arr2; // add the inner array after building it.
}

console.log(JSON.stringify(arr)); // because console.log lets us see more detail than alert.

alert("Finally: " + arr);