因此,基本上我早些时候在同一主题上问过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/

10-09 17:51