Array(length).fill(value)是初始化固定长度数组的最简正确方式,它先创建稀疏数组再填充真实元素;不调用fill()则map()等方法会跳过空槽,且Array(5)≠[undefined×5]。
fill() 初始化固定长度数组的正确姿势
直接用
是最简方式,但必须注意:它创建的是稀疏数组(sparse array),
才真正“填充”出可枚举的元素。不调用
就直接访问索引会得到
,且
、
等方法会跳过未定义位置。
为什么 Array(5) 不等于 [undefined, undefined, undefined, undefined, undefined]
创建的是一个长度为 5 的空槽数组(holes),内部没有实际属性,
返回空数组,
返回
(空数组)。只有
能把每个索引位置显式设为指定值,使其具备“真实元素”语义。
✅ 正确:
→
❌ 错误:
→
(空)
⚠️ 注意:
所有元素引用同一个空数组,修改任一元素会影响全部
fill() 的参数细节与常见陷阱
支持三个参数:
,其中
和
支持负数索引(从末尾计数)。默认
,
。若只传一个参数,就是全量填充。
填充前 3 个位置:
→
(⚠️ 后两个仍是空槽!)
填充后 2 个位置:
→
想避免引用共享,得用
替代
替代方案对比:Array.from vs fill()
当默认值需动态计算(比如随机数、对象实例),
更合适;若只是静态值,
更轻量、更直观。
静态值(推荐
):
、
动态值(必须用
):
→
对象数组(避免引用污染):
,而非
容易被忽略的是:即使你只想要一个全是
或
的数组,也得先用
构造骨架再
,不能省略构造步骤——JavaScript 没有类似 Python 的
语法糖。
Array(length).fill(value)fill()fill()undefinedmap()forEach()Array(5)Object.keys(Array(5))Array(5).map(() => 1)[ ]fill()Array(5).fill(0)[0, 0, 0, 0, 0]Array(5).map(() => 0)[]Array(5).fill([])fill()fill(value, start?, end?)startendstart = 0end = this.lengthArray(5).fill('x', 0, 3)['x', 'x', 'x', undefined, undefined]Array(5).fill('y', -2)[undefined, undefined, undefined, 'y', 'y']Array.from({ length: 5 }, () => [])fill([])Array.from()fill()fillArray(3).fill(null)Array(4).fill('default')Array.fromArray.from({ length: 3 }, (_, i) => i * 2)[0, 2, 4]Array.from({ length: 3 }, () => ({}))Array(3).fill({})0falseArray(n)fill()[0] * n