稀疏数组的“空位”是完全不存在的索引,for、for...in、foreach、map 均跳过;判断索引是否存在应使用 i in arr 或 hasownproperty;推荐用 array.from(arr) 转为稠密数组再遍历。

JS 中稀疏数组的“空位”(holes)不是 undefined,而是**完全不存在的索引**,因此传统 for 循环或 for...in 会跳过它们,但 forEach、map 等迭代方法也跳过——这常被误认为“遍历不全”,其实它们行为一致且符合规范。真正需要“跳过空位并只处理真实元素”时,关键是**识别哪些索引是真实存在的**。
用 in 操作符或 hasOwnProperty 判断索引是否存在
空位在数组中没有对应的属性,所以可用 in 或 Object.prototype.hasOwnProperty.call(arr, i) 显式检测索引是否真实存在:
-
i in arr→ 返回true仅当索引i是数组自身的可枚举属性(即非空位) - 注意:
arr[i] !== undefined不可靠,因为数组可能存了undefined值,它和空位表现不同
推荐:用 Array.from(arr) 转为稠密数组再遍历
Array.from 会把稀疏数组中的空位自动映射为 undefined,生成一个长度相同、无 holes 的新数组:
-
Array.from([1, , 3])→[1, undefined, 3] - 之后可用
forEach、map、for...of安全遍历,每个索引都存在 - 如果只想处理“非空位且值不为 undefined”,再加一层判断即可
避免陷阱:别用 for...in 遍历数组
for...in 会遍历所有可枚举属性(包括原型链上新增的),且不保证顺序,还可能漏掉数字索引(某些引擎对稀疏数组优化后跳过 holes):
- 即使
for...in碰巧访问到某些数字索引,也不代表它能可靠覆盖所有真实元素 - 数组应优先用
for、for...of、Array.prototype方法
进阶:手动遍历并过滤空位(适合大数组或需精确控制)
若不想创建新数组,可用传统 for 循环 + in 检查:
const arr = [1, , 3, , 5]; for (let i = 0; i











