new array(size) 创建的是稀疏数组,索引位置为空槽(非 undefined),属性不存在,in 操作符和 object.hasown 返回 false;foreach、map 等方法跳过空槽,而 for...of 返回 undefined。

new Array(size) 创建的数组不包含任何实际元素,只分配长度,索引位置全是空槽(empty slot),不是 undefined,也不是属性缺失的“undefined 值”,而是根本不存在该索引属性。这种结构会显著影响多数迭代方法的行为——它们不是报错,而是直接跳过这些位置。
空槽的本质:不是值,是属性缺失
空槽不是数据,而是对象内部没有定义对应索引属性。因此:
-
arr[0]返回undefined,但这只是读取不存在属性的默认行为,不代表该位置存了undefined; -
0 in arr返回false,说明索引 0 不是数组的自有属性; -
Object.hasOwn(arr, 0)同样返回false,这是更可靠的检测方式(推荐); -
JSON.stringify(arr)输出[null, null, ...](注意:这是 JSON 规范对空槽的序列化表现,非 JS 运行时值)。
哪些迭代方法会被“屏蔽”?
以下方法完全忽略空槽,既不传参给回调,也不改变返回数组结构:
-
forEach、map、filter、reduce、find、some、every—— 全部跳过空槽; - 例如:
new Array(3).forEach(() => console.log('run'))什么也不会输出; -
[,,].map(x => x * 2)返回[,,](仍是稀疏数组,长度为 2,无新属性)。
哪些迭代方法仍会“触达”空槽?
这些方式会显式暴露空槽的存在,或将其转为 undefined:
-
for...of:对每个空槽返回undefined; for (let i = 0; i :访问空槽时返回 <code>undefined;-
Array.from(arr)或[...arr]:把所有空槽转为显式的undefined,生成稠密数组; -
entries()、keys()、values():只遍历存在属性的位置,空槽不出现(即[,,].entries()是空迭代器)。
如何安全初始化避免空槽陷阱?
若目标是创建指定长度、元素为 undefined(或某默认值)的稠密数组,应避开 new Array(n):
- 用
Array(n).fill()→ 所有位置填undefined; - 用
Array.from({ length: n })→ 每个位置映射为undefined; - 用
Array.from({ length: n }, () => defaultValue)→ 自定义初始值; - 避免
delete和越界赋值(如arr[100] = 'x'),以防无意制造稀疏性。










