数组空位是索引缺失而非值,map保留空位结构但跳过执行,foreach/filter/reduce完全忽略空位,join将空位转为空字符串,entries/for...of/array.from暴露空位为undefined。

数组空位(Hole)不是值,而是索引位置的“缺失”。它在不同方法中行为差异显著,识别关键在于观察是否跳过、是否保留、是否影响结果结构。
map 方法:跳过空位,但保留位置结构
map 不会对空位执行回调函数,但新数组中对应位置仍为空位(不是 undefined)。
- 空位处不调用回调,也不传入任何值(
currentValue不是undefined,而是根本未提供) - 返回的新数组长度与原数组一致,空位被原样保留
- 示例:
[1, , 3].map(x => x * 2)→[2, , 6](索引 1 仍是空位) - ⚠️ 注意:
[1, undefined, 3].map(x => x * 2)→[2, NaN, 6](因为undefined * 2 === NaN)
forEach / filter / reduce:全部跳过空位
这些方法在遍历时完全忽略空位,既不触发回调,也不将其计入迭代次数或聚合过程。
-
[1, , 3].forEach(console.log)只打印1和3(两次调用,不处理索引 1) -
[1, , 3, undefined].filter(x => true)→[1, 3, undefined](空位被剔除,undefined被保留) -
reduce的累加器不会接收空位,初始值若从索引 0 开始,则第一个非空位元素作为accumulator起点
join 方法:将空位转为空字符串
join() 对空位的处理非常特殊——它把空位当作 ''(空字符串),而非 undefined 或 null。
-
[1, , 3].join('-')→"1--3"(两个连字符,中间是空位转来的空字符串) -
[1, undefined, 3].join('-')→"1-undefined-3"(undefined被显式转为字符串"undefined") -
[1, null, 3].join('-')→"1-null-3"
entries / for...of / Array.from:暴露空位存在性
这些现代迭代方式能“看到”空位,它们产出索引,但值在空位处为 undefined(注意:这是读取行为,不是赋值)。
-
[ , , 3].entries()产出[0, undefined]、[1, undefined]、[2, 3] -
Array.from([ , , 3])→[undefined, undefined, 3](空位被统一补为undefined) - ⚠️ 关键区别:
v === undefined无法区分是空位还是存的undefined;需配合i in arr判断——空位时返回false,显式undefined时返回true










