js初始化二维数组

JavaScript如何初始化一个二维数组?

可以使用for循环来解决:

const arr = new Array(7)
const len = arr.length
for(let i = 0; i < len; i++) {
  // 将数组的每一个坑位初始化为数组
  arr[i] = []
}
console.log(arr)

arr打印出来的结果是:

对了,不是有一个fill方法么?

下面这样初始化二维数组可不可以?

const arr = (new Array(7)).fill([])

乍一看没问题,7个坑都被填上了数组元素:

但是当我们想修改某个坑里的数组的值的时候:

arr[0][0] = 1

你会发现,一整列的元素都被设为了1

为什么会这样呢?

这就得从fill的工作机制说起了。我们要清楚,当我们给fill传递一个入参时,如果这个入参的类型是引用类型,那么fill在填充坑位时填充的其实就是入参的引用。

也就是说,下图中我们看似是给7个坑位各初始化了一个数组:

其实这7个数组对应了同一个引用、指向的是同一块内存空间,它们本质上是同一个数组。

所以我们就知道为什么当我们修改第0行第0个元素的值时,第1到6行的第0个元素也都跟着变化了。