map方法天然跳过稀疏数组的空位,仅对实际存在的索引调用回调;空位指未赋值、属性不存在的位置,不同于显式存入undefined的密集数组。

JavaScript 中 map 方法**天然跳过稀疏数组的空位(empty slots)**,根本不会为这些位置调用回调函数——这是它的默认行为,无需额外处理。
什么是稀疏数组的“空位”?
稀疏数组是指索引不连续、某些索引位置未被赋值(不是 undefined,而是压根不存在)的数组。例如:
const arr = [1, , 3]; // 索引 1 是空位(不是 undefined,是 missing) arr.length === 3; // true arr[1] === undefined; // true,但这个 undefined 是“读取缺失属性”的结果,不是显式赋值
注意:这和 [1, undefined, 3] 不同——后者索引 1 是显式存了 undefined,属于“密集数组”,map 会触发回调。
map 对空位的处理是规范定义的行为
根据 ECMAScript 规范,Array.prototype.map 只会对**实际存在的索引属性**调用回调。它内部使用 in 操作符或等效逻辑检测属性是否存在,跳过所有空位。
立即学习“Java免费学习笔记(深入)”;
所以你不需要做任何事,它就已经按需跳过了:
const sparse = [10, , 30];
const doubled = sparse.map(x => {
console.log('called with:', x); // 只输出两次:10 和 30
return x * 2;
});
// doubled === [20, , 60]常见误解与对比
-
空位 ≠ undefined 元素:若写
[10, undefined, 30],map会为中间项调用回调(传入undefined)。 -
for...of / for...in 不等价:
for...of也会跳过空位(返回undefined),但语义不同;for...in可能遍历到原型链属性,且不保证顺序,不推荐用于数组。 -
Array.from 或扩展运算符会“填充”空位:
[...sparse]或Array.from(sparse)会把空位转为undefined元素,此时再map就会触发回调。
想确认是否真跳过了?可以这样验证
用 Object.keys() 或 Object.getOwnPropertyNames() 查看哪些索引真实存在:
const a = [1, , 3]; console.log(Object.keys(a)); // ['0', '2'] → 只有 0 和 2 存在 a.map((x, i) => console.log(i)); // 只打印 0 和 2


















