数组字面量是js引擎深度优化的核心语法,因其结构、长度和类型可静态推断,避免运行时开销;展开运算符仅在可静态推断的字面量中走高性能路径;破坏数组形状稳定性会丧失优化效果。

数组字面量在现代 JS 引擎(如 V8)中不是“写法简单而已”,而是被深度优化的核心语法之一。引擎能提前确定结构、长度和元素类型,从而跳过运行时动态判断,直接生成高效机器码。
字面量创建比构造函数快得多
使用 [1, 2, 3] 比 new Array(1, 2, 3) 或 Array.of(1, 2, 3) 更快,原因有三:
- 引擎无需调用构造函数逻辑,避免原型链查找和参数校验开销
- 单数字参数歧义被彻底规避(
Array(5)创建稀疏数组,而[5]明确是含一个元素的数组) - 字面量在解析阶段即可标记为“稳定结构”,为后续 JIT 编译提供确定性信息
展开运算符的快速路径依赖字面量上下文
展开(...)是否走高性能路径,关键看它是否出现在**可静态推断的字面量中**:
- ✅ 高效写法:
[...[1, 2], 3]、[a, b, ...fixedArr](fixedArr是 const 声明的固定长度数组) - ❌ 降级写法:
[...getArray(), 3]、[...new Proxy([1], {})]、[...[, , 3]] - 尾部展开更易优化——引擎可预先分配目标数组空间,再批量填入展开元素
保持数组形状稳定才能持续受益
字面量本身快,但若后续操作破坏其“可预测性”,优化效果会消失:
- 避免稀疏赋值:
arr[1000] = 'x'会让引擎放弃连续内存布局假设 - 不要混用数字索引与字符串键:
arr['meta'] = true会触发隐藏类变更,影响访问速度 - 优先用
map/filter等内置方法,它们内部已针对字面量生成的数组做了路径特化
实际优化建议
不需要改写底层逻辑,只需调整惯用模式:
- 热代码中,把动态数组先转成稳定结构再展开:
const stable = Array.from(dynamic)或dynamic.slice() - 拼接多个已知数组时,优先字面量嵌套:
[...base, ...extras, 'end'],而非多次push或concat - 用
console.time()在 Chrome 中验证:相同数据下,[x, ...arr]和[...arr, x]耗时可能差 2–3 倍
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











