Array(n).map(() => Array(n).fill(false))和 [...Array(n)].map(() => Array(n).fill(false))的结果并不一样,后者是一个全是false的二维数组,而前者还是Empty*n的一维数组
原因在于 Array(n).map()
方法的行为与预期不同,这与 map
方法的机制有关。
当你使用 Array(n)
创建一个长度为 n
的数组时,你得到的是一个含有 n
个空槽位的数组,而不是 n
个 undefined
值。这些空槽位是特殊的,因为它们实际上并不是数组中的有效索引。当你在这样的数组上调用 map()
方法时,map
会跳过空槽位,不会执行提供的回调函数。
举个例子来说,如果你做下面这个操作:
const arr = Array(3).map(() => 'hello');
arr
并不会变成 ['hello', 'hello', 'hello']
,而是会保持为 [empty × 3]
,因为 map
方法跳过了所有的空槽位。
另一方面,当你使用扩展运算符 ...
,它会将 Array(n)
中的空槽位转换为 undefined
值,因为扩展运算符迭代的是数组的索引。这样一来,[...Array(n)]
就变成了一个实际包含 undefined
的数组,而不是有空槽位的数组。然后,你可以在这个新数组上使用 map()
方法,它会为数组中的每个 undefined
元素执行回调函数。
因此:
const arr = [...Array(3)].map(() => 'hello');
这时 arr
就会变成 ['hello', 'hello', 'hello']
。
所以,当你想要利用 map
方法来初始化一个二维数组时,你需要确保原始数组不是有空槽位的数组。使用扩展运算符或者其他方法(例如 Array.from
或者先使用 fill
)来创建一个没有空槽位的数组,然后再用 map
方法去填充它。