JavaScript中fill填充嵌套数组后push操作异常的原因及解决方法
异常原因说明
Array.prototype.fill 方法传入引用类型值时,只会将同一个引用复制到数组的所有位置,不会为每个位置单独创建新的实例,这一行为是ECMAScript标准明确定义的。
你代码中new Array(10).fill([])执行时,仅生成了1个空数组,bucket的10个元素全部指向这个空数组的内存地址。你后续给bucket[0]直接赋值[1,2],相当于把第0位的引用替换为了独立的新数组,剩下索引1到9仍然共享初始的同一个空数组引用,因此对bucket[1]执行push操作时,本质是修改所有索引共享的那个数组,所有位置都会同步显示修改结果。
正确实现方案
要实现每个嵌套数组独立,可选用以下两种常用方案:
- 方案1:使用
Array.from初始化,回调函数每次执行都会返回全新的空数组
let bucket = Array.from({length: 10}, () => []); bucket[0] = [1,2]; bucket[1].push(3); // 输出结果为 [[1,2], [3], [], [], [], [], [], [], [], []]
- 方案2:通过循环逐个初始化嵌套数组
let bucket = new Array(10); for(let i = 0; i < bucket.length; i++){ bucket[i] = []; } bucket[0] = [1,2]; bucket[1].push(3);
内容的提问来源于stack exchange,提问作者Howard Do
相关产品推荐
相关产品推荐

