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个元素也都跟着变化了。