因此,基本上我早些时候在同一主题上问过similar question,尽管我理解了答案中的解决方案是如何工作的以及为什么起作用(我很感激),但是我无法确定我的代码为什么不起作用的原因。因此,该程序旨在生成一个二维数组,该数组应复制一个乘法表。但是,重复行的值,而不是适当地不同。
所以基本上,它会产生
[[3,6,9],
[3,6,9],
[3,6,9]]代替预期的[[1,2,3],
[2,4,6],
[3,6,9]]。显然发生的是,在分配了数组“行”(对应于由外循环分配的arr2)之后,在循环的下一个重复中,不仅当前元素arr [j]受到影响,而且先前的元素即使没有(明确地?)寻址和重新分配,也会按照arr2的更新(更改)值进行更改/更新。
Alert语句说明了这一点,即使索引元素在不同的循环中具有不同的值,即使它们应该被分配一次,因此在分配之后也不应更改(至少据我所知,因为它们仅由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>
最佳答案
您已经在arr2
循环之外用以下代码声明了for
:
var arr2 = [];
这意味着每次您运行此代码:
for (var k = 0; k < 3; k++) {
arr2[k] = (k + 1) * (j + 1);
}
...您只是在替换
arr2
实例中的值。这行:
arr[j] = arr2;
...正在存储对该
arr2
的一个实例的引用,而不是其副本。因此,每次更改arr2
时,在arr
中对其的每个引用也会随之更改。关于javascript - Javascript 2D数组生成,“奇怪”行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22288713/