数组字面量本身不会创建稀疏数组,仅[1,,3]等含连续逗号的写法会显式产生空槽;常见稀疏数组源于Array(5)、越界赋值、delete等操作,导致迭代变慢、引擎降级及方法异常;应避免delete、慎用Array(n),优先用fill或Array.from初始化。

数组字面量本身不会创建稀疏数组,因此在“处理稀疏数组”这个前提下,它没有额外性能开销——因为它压根不参与稀疏结构的生成或维护。
字面量与稀疏数组无直接关联
数组字面量 [] 或 [1, , 3] 是声明式语法,语义明确:
-
[1, , 3]中的连续逗号会显式产生一个空槽(hole),这是唯一由字面量直接创建稀疏数组的方式; - 但这种写法极少见,且属于刻意为之,不是日常开发中的典型用法;
- 绝大多数字面量如
[1, 2, 3]、['a', 'b']创建的是密集数组,引擎可直接分配连续内存,无稀疏开销。
真正引发稀疏性的常见操作
稀疏数组通常来自非字面量行为,这些操作才带来真实性能影响:
-
Array(5):构造函数单参数调用,生成 length=5 的空槽数组; -
arr[100] = 'x':跳过中间索引直接赋值,导致 0–99 成为空洞; -
delete arr[0]:删除元素后 length 不变,但索引 0 变为空槽; -
arr.length = 0后再部分赋值,也可能触发稀疏退化。
稀疏数组对后续操作的实际影响
一旦数组变为稀疏,无论最初如何创建,以下行为会明显变慢:
立即学习“Java免费学习笔记(深入)”;
-
forEach、map、filter等迭代方法需跳过空槽,内部逻辑更复杂; - V8 引擎会将数组从 fast elements 模式降级为 dictionary elements,失去连续内存访问优势;
-
in操作符、hasOwnProperty判断失效,Object.keys()返回不完整键列表; - 某些数学方法(如
reduce)若未预判空槽,可能意外跳过或返回NaN。
如何避免无意中制造稀疏数组
保持数组密集,是规避相关性能问题的根本方式:
- 用
[]创建数组,不用Array(n)预分配; - 需要初始化固定长度时,优先选
Array.from({ length: n }, () => undefined)或new Array(n).fill(null); - 避免用
delete修改数组,改用splice或过滤重建; - 动态索引赋值前,先确保中间索引已存在(如用
Array(n).fill()奠定基础)。



















