所以基本上我之前就同一个主题问了一个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>
答案 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);