javascript的fill()方法用于填充已有数组,不创建新数组;支持全量填充、区间填充(含负数索引)和对象数组安全初始化,但需避免引用共享及兼容性问题。

JavaScript 的 fill() 方法能快速批量初始化数组,但关键在于“先有数组,再填充”——它不创建数组,只修改已有数组的内容。
基础用法:填满固定长度的基本类型数组
最常用、最简洁的写法是结合 Array(n) 构造稀疏数组,再链式调用 fill():
-
Array(5).fill(0)→[0, 0, 0, 0, 0] -
new Array(3).fill('x')→['x', 'x', 'x'] -
Array(4).fill(null)→[null, null, null, null]
注意:Array(5) 创建的是含 5 个空位(empty slots)的数组,不是 5 个 undefined;fill() 会把所有位置(包括空位)设为指定值,因此这一步是安全且高效的。
按范围填充:只初始化部分元素
利用 fill(value, start, end) 的区间参数,可精准控制起始和结束索引(左闭右开):
-
Array(6).fill(1).fill(9, 2, 4)→ 先全填 1,再把索引 2 和 3 改为 9 →[1, 1, 9, 9, 1, 1] -
const row = Array(5).fill(0); row.fill(1, 1, 4);→[0, 1, 1, 1, 0],适合构造带边框或掩码的结构 - 负数索引从末尾算:
Array(5).fill('a', -2)→ 填最后两个位置 →[empty, empty, 'a', 'a', 'a']
对象数组初始化:避免引用共享陷阱
直接用 fill({}) 或 fill([]) 会导致所有元素指向同一对象,修改一个就影响全部:
- ❌ 错误:
Array(3).fill({id: 1})→ 三个元素共用一个对象 - ✅ 正确(推荐):
Array.from({length: 3}, () => ({id: 1}))—— 每次回调新建独立对象 - ✅ 替代写法:
Array(3).fill(null).map(() => ({id: 1}))—— 先填占位值,再映射生成新对象
这个原则同样适用于二维数组:不能 Array(3).fill(Array(4).fill(0))(所有行引用同一子数组),而应写成 Array.from({length: 3}, () => Array(4).fill(0))。
常见误区与避坑提醒
fill() 看似简单,但几个细节容易导致静默错误:
-
[].fill(5)结果仍是空数组[],因为原数组长度为 0,无位置可填 -
fill()是原地操作,不返回新数组,也不改变数组长度 - 传入
start > end、越界或NaN索引时,不报错,但无任何效果 - IE 完全不支持
fill()和Array.from(),如需兼容,必须回退到for循环
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











