应优先使用数组字面量([]),因其更安全、更快、语义更清晰;Array()构造函数仅适用于极少数需预分配稀疏结构的场景,且单参数行为差异大——[5]创建含元素5的数组,new Array(5)则创建length为5但无实际元素的稀疏数组。

创建数组时,优先用字面量 [],它更安全、更快、语义更清晰;Array() 构造函数仅在极少数明确需要预分配稀疏结构的场景下才考虑。
单参数行为截然不同
这是最易踩坑的地方:
-
[5]→ 含一个数字5的数组,length === 1,0 in arr为true -
new Array(5)→ 长度为5的空槽数组,length === 5,但所有索引都不存在(0 in arr为false) -
new Array(3.14)→ 直接抛出RangeError;而[3.14]安全无误
类型安全与可预测性
字面量对输入不做隐式解释,含义始终一致:
-
["hello"]、[{}]、[null]、[undefined]都是含一个对应值的数组 -
Array("hello")得到["hello"],Array({})得到[{}],看似一样,但Array(null)和Array(undefined)的底层处理路径不同,逻辑混杂 - 动态传参时风险放大:若
const args = [n],Array(...args)与Array(n)行为可能完全不同,而[...args]始终可靠
性能和现代语法适配性
引擎对字面量有深度优化,且与 ES6+ 特性天然契合:
立即学习“Java免费学习笔记(深入)”;
- V8 等引擎将
[]或[1, 'a']视为常量结构,在解析阶段就完成类型与长度推断 -
new Array()需走完整函数调用流程:原型查找、this绑定、参数个数判断、分支逻辑处理 - 嵌套数组:
[[1,2],[3,4]]清晰;Array(Array(1,2), Array(3,4))不仅冗长,还会因参数类型不匹配而报错 - 解构、展开、
Array.from、fill等操作,默认围绕字面量设计,强行混用构造函数反而绕远路
什么情况下可考虑 Array 构造函数?
仅当同时满足以下全部条件:
- 明确需要长度固定、初始无元素的稀疏缓冲区(如 WebGL 数据填充、大数组预分配)
- 已排除更安全的替代写法,例如:
Array.from({ length: n }, () => undefined)或new Array(n).fill(null) - 团队规范允许,并配有清晰注释说明意图,例如:
// pre-allocate sparse buffer for performance


















