使用Array构造函数创建的嵌套数组 - 引用问题

时间:2018-01-21 19:06:23

标签: javascript arrays

我需要创建一个数组数组。每个嵌套数组都应该用零填充。我试过这个:

let test = Array
  .from(
    new Array(8)
      .fill(
        new Array(8).fill(0)
      )
  );

但是后来我提到了一个参考问题。例如,如果我这样做:
test[1][2] = 1;
然后每个嵌套数组在索引1处具有值2
console.log(test[2][2]) // 1

我想出了一个使用循环的简单解决方案:

const testArray = new Array(8);

for (let i = 0; i < testArray.length; i++) {
  testArray[i] = new Array(8).fill(0);
}

现在它有效并且参考没有问题。但是我不明白为什么在第一次尝试时出现这个问题。有人可以这么善良并向我解释一下吗?

2 个答案:

答案 0 :(得分:3)

您使用8个与单个数组相同的引用来填充数组,而不是对8个单独数组的8个不同引用。 a[0]为它填充的数组中的每个条目重用相同的值,所以你得到这个:

+−−−−−−−−−−−−+
|  (array)   |
+−−−−−−−−−−−−+                           +−−−−−−−−−+
| 0: Ref2215 |−−−−−−−−+−+−+−+−+−+−+−−−−−>| (array) |
| 1: Ref2215 |−−−−−−−/ / / / / / /       +−−−−−−−−−+
| 2: Ref2215 |−−−−−−−−/ / / / / /        | 0: 0    |
| 3: Ref2215 |−−−−−−−−−/ / / / /         | 1: 0    |
| 4: Ref2215 |−−−−−−−−−−/ / / /          | 2: 0    |
| 5: Ref2215 |−−−−−−−−−−−/ / /           | ...     |
| 6: Ref2215 |−−−−−−−−−−−−/ /            +−−−−−−−−−+
| 7: Ref2215 |−−−−−−−−−−−−−+
+−−−−−−−−−−−−+

使用哪个数组插槽并不重要,它们都包含对同一个数组的引用。

你的第二个代码块创建了单独的数组(我不打扰图:-))。这是一个稍微简短的方法:

a[1]

请注意fill没有任何理由。

答案 1 :(得分:1)

原因是第二个new Array(8).fill(0)被父Array()的所有单元格引用。您正在创建仅一次

相反,在第二次尝试中,您将创建它8次。