array(n) 创建的是稀疏数组,仅 length 为 n,无实际元素,不能被 map/foreach 遍历;需用 .fill() 初始化为稠密数组,或用 array.from({length:n}, fn) 安全创建含独立对象的数组。

直接用 Array(n) 创建的是一个长度为 n 的稀疏数组,所有位置都是空槽(empty slots),不是 undefined,也不能被 map、forEach 等方法遍历。它本身不包含任何实际元素,只是 length 被设为 n。
要真正初始化成带默认值的固定长度数组,必须配合 .fill() 使用:
- ✅ 正确写法:
Array(5).fill(0)→[0, 0, 0, 0, 0] - ✅ 同样有效:
new Array(5).fill('x')→['x', 'x', 'x', 'x', 'x']
注意:.fill() 是原地修改,不创建新数组;它会把所有索引位置(包括原本的空槽)都设为指定值,从而生成稠密数组。
⚠️ 常见误区
-
Array(5)≠[undefined, undefined, undefined, undefined, undefined] -
Array(5).map(() => 1)返回[](空数组),因为map跳过空槽 -
Array(3).fill({})会让三个元素引用同一个对象,改一个全变
✅ 安全初始化对象数组
别用 fill,改用:
-
Array.from({ length: 3 }, () => ({})) - 或
Array(3).fill(null).map(() => ({}))
? 小结
- 原始值(数字、字符串等)默认填充:优先
Array(n).fill(val),简洁且引擎优化好 - 需独立对象、需索引计算、或需兼容老环境:用
Array.from({ length: n }, fn) - 不要单独写
Array(n)就以为数组“已初始化”——它只是个空壳,必须.fill()或.map()(但后者要先实化)才能用











