concat 不修改原数组而返回新数组,支持添加单个值、多个值或数组,可实现头尾添加,但引用类型仅浅拷贝,适合不可变操作场景。

直接用 concat 添加元素到数组,不会修改原数组,而是返回一个新数组。
concat 的基本用法:添加单个或多个元素
concat 原本设计用于合并数组,但它也能接受非数组值(如数字、字符串、对象),自动将它们当作单元素数组处理。
- 传入一个值:
[1, 2].concat(3)→[1, 2, 3] - 传入多个值:
[1, 2].concat(3, 4, 5)→[1, 2, 3, 4, 5] - 传入数组:
[1, 2].concat([3, 4], [5])→[1, 2, 3, 4, 5]
添加元素到开头或结尾的常见场景
虽然 concat 本身不区分“开头”或“结尾”,但顺序由参数位置决定:左侧是原数组,右侧是追加内容。若想加到开头,把新内容写在前面即可。
- 加到结尾:
arr.concat( newItem )或arr.concat([ newItem ]) - 加到开头:
[ newItem ].concat( arr ) - 同时加头尾:
[ first ].concat( arr, last )
注意点:避免误传引用类型导致意外修改
如果添加的是对象或数组等引用类型,concat 只复制引用,不深拷贝。原对象仍可被间接修改。
-
const a = [{ x: 1 }]; const b = a.concat({ y: 2 }); b[0].x = 99;→a[0].x也会变成99 - 需要深拷贝时,不能只靠
concat,得配合structuredClone或其他方案
对比 push 和 concat 的核心区别
push 改变原数组并返回新长度;concat 不改变原数组,返回新数组——这是函数式编程中“不可变操作”的典型做法。
- ✅ 安全:原数组保持不变,适合 React state 更新、Redux 等场景
- ✅ 链式调用友好:
arr.concat(x).filter(...).map(...) - ⚠️ 性能略低:每次调用都创建新数组,大数据量时注意内存开销











