所有的答案都是正确和合理的,所以我决定在我的Chrome控制台上尝试一下。因此,对于OP的答案是,这是因为您无法直接填充。
如果我理解问题的一部分是为什么不能只做:
const grid = Array(5).fill([])
这段话的意思是:好的,我们有一个像这样的结构:
然后你说去这样填写第三个:
grid[2].push("third rank item");
但是,你没有看到第三个填满该字符串,而是所有的都被填充了。原因很简单,你创建了一个单一的数组并将其扔到了网格中的每个位置。在内存中只有一个内部数组,所以当你把这个字符串扔到那个数组里时,它会影响每个索引。
但我发现有些行为与我预期的略有不同。
如果您编写以下内容:
const grid = Array(3).fill([false, false, false])
你将会得到以下内容:
(3) [Array(3), Array(3), Array(3)]
(3) [false, false, false]
(3) [false, false, false]
(3) [false, false, false]
然后如果你运行:
grid[0].push(true)
,你会得到以下结果:
(3) [Array(4), Array(4), Array(4)]
(4) [false, false, false, true]
(4) [false, false, false, true]
(4) [false, false, false, true]
因此,修改一个会修改所有内容,这就是为什么你不能像之前那样直接填充然后推送,而是必须使用map()
语句,如下所示:
const grid = Array(3)
.fill(null)
.map(() => Array(3).fill(false));
这将运行内部函数三次,每次我们都会生成一个全新且不同的数组。
Array.from(new Array(5), () => [])
。 - user663031