使用JavaScript的fill()与扩展语法出现异常结果的原因咨询
为什么用fill()创建二维数组会导致所有子数组同步更新?
问题出在Array.fill([])的工作机制上:
- 当你调用
Array(9).fill([])时,fill方法会把你传入的同一个空数组引用,复制到新数组的每一个位置里。也就是说,v数组里的9个元素,指向的都是内存中同一个数组对象。 - 所以你在
arr.map里执行v[i].push(val)时,本质上是在反复给同一个数组添加元素,最后每个子数组自然都会包含完整的arr内容。
而你直接写let v = [[],[],[],[],[],[],[],[],[]]时,每一个[]都是独立创建的新数组,它们各自有自己的内存地址,互不干扰。这时候v[i].push(val)只会修改对应索引位置的那个独立数组,结果就符合预期了。
如果想用类似fill的方式创建正确的二维数组,可以用Array.from来生成,它的第二个参数是回调函数,每次调用都会返回一个新的空数组:
let v = Array.from({length: 9}, () => []);
内容的提问来源于stack exchange,提问作者Ольга Сіра
相关产品推荐
相关产品推荐

