我需要创建一个数组数组。每个嵌套数组都应该用零填充。我试过这个:
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);
}
现在它有效并且参考没有问题。但是我不明白为什么在第一次尝试时出现这个问题。有人可以这么善良并向我解释一下吗?
答案 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次。