concat适用于兼容IE且需链式调用的场景,返回新数组不修改原数组;扩展运算符语法更简洁、支持解构与组合操作,是现代开发首选,但不兼容IE且不能直接展开null/undefined。

JavaScript中合并数组,concat 和 扩展运算符(...) 都能实现,但适用场景和行为细节有明显区别。选哪个不只看“能不能用”,更要看是否修改原数组、是否处理嵌套、是否需要兼容老环境、以及代码可读性。
需要保持原数组不变且兼容IE时用 concat
concat 是传统方法,返回新数组,不改变原数组,且支持 IE6+,适合对兼容性要求高的项目。
- 可以链式调用:[1, 2].concat([3], [4, 5]).concat(6) → [1, 2, 3, 4, 5, 6]
- 传入非数组值会被当作单个元素处理:[1].concat(2, [3, 4]) → [1, 2, 3, 4]
- 对空值或 undefined 处理较宽松:[1].concat(null, undefined) → [1, null, undefined]
需要简洁语法、解构能力或操作对象时优先用扩展运算符
扩展运算符写法更直观,天然支持解构、过滤、映射等组合操作,是现代开发的主流选择。
- 可与其他数组方法自然配合:[...arr1, ...arr2].filter(x => x > 0).map(x => x * 2)
- 能轻松插入元素:[...arr1, 'new', ...arr2]
- 可展开类数组或可迭代对象:[...document.querySelectorAll('div')]、[...'abc'] → ['a','b','c']
- 注意:不能直接展开 null 或 undefined,会报错,需提前判断
处理嵌套数组时行为不同,需特别注意
concat 对嵌套数组是浅合并,扩展运算符也一样——都不会自动扁平化。但 concat 支持传入 flatMap 类似逻辑,而扩展运算符需显式调用 flat()。
立即学习“Java免费学习笔记(深入)”;
- [1, [2, 3]].concat([4, [5, 6]]) → [1, [2, 3], 4, [5, 6]]
- [...[1, [2, 3]], ...[4, [5, 6]]] → [1, [2, 3], 4, [5, 6]]
- 如需扁平一层:[...arr1, ...arr2].flat(1) 或 arr1.concat(arr2).flat(1)
性能与语义:小数组无差别,大数组或高频操作需实测
两者时间复杂度都是 O(n),日常使用无需过度优化。但 concat 在 V8 中做了较多底层优化,某些旧版本引擎下大批量合并略快;而扩展运算符因语法糖特性,在构建动态数组时语义更清晰。
- 纯合并场景:性能差异可忽略,优先选可读性强的写法
- 需条件拼接时,扩展运算符更灵活:[...flag ? arr1 : [], ...arr2]
- 函数参数传递推荐扩展运算符:Math.max(...arr) 比 Math.max.apply(null, arr) 更安全简洁


















