当使用fill拷贝数组时,发生想不到的事情

440 阅读1分钟

如题 在一个二维数组里执行一段代码

const a = new Array(3).fill(new Array(3).fill(false))

得到的是一个二位list数组, 再执行命令

a[0][0]  = true

在此跟预想的结果完全不一致 理论上应该只有第一位值会变成true 因为a [0][0]锁定的是第一行第一列的值变为true  

那么为什么结果第一列的值都变成true了呢  

解析:

其实关键点在创立二维数组的方法上 new Array(3).fill(false)

new Array(3).fill(false)
这个方法本身就是填充一个数组的值都为falsenew Array(3).fill的方法是先建立一个数组,然后拷贝拷贝变成一个矩阵数组

那结果就出来了, 后面两行数组是拷贝第一行的值,所以当第一行的值改变时,后面两行数组第一位的值也是指向第一行数组的内存的。 相当于浅拷贝

如果不用fill  用forEach来执行结果将完全不一样 ,有兴趣的可以自己尝试。