concat方法返回新数组且不修改原数组,天然支持浅拷贝;但嵌套引用类型仍共享内存,需深拷贝时应选用structuredClone()等方案。

JavaScript 中 concat 方法本身不会修改原数组,而是返回一个新数组,因此天然具备“复制且不污染原数组”的特性。只要不把返回值重新赋值给原变量,就能安全实现浅拷贝。
concat 复制数组的基本用法
concat 用于合并两个或多个数组,它不改变现有数组,只返回一个新数组。即使只传入空参数或不传参,也能生成原数组的浅拷贝:
-
arr.concat()→ 返回一个新数组,内容与arr相同 -
arr.concat([])或arr.concat([1,2])→ 同样返回新数组,原数组不变
注意:这是浅拷贝,嵌套对象仍共享引用
如果原数组包含对象、数组等引用类型,concat 只复制外层数组结构,内部对象的引用并未分离:
const original = [1, { name: 'Alice' }];
const copy = original.concat();
copy[1].name = 'Bob';
console.log(original[1].name); // 'Bob' —— 原数组被意外影响
此时若需深拷贝,应改用 structuredClone()(现代浏览器)、JSON.parse(JSON.stringify())(简单场景),或专门的深拷贝库。
立即学习“Java免费学习笔记(深入)”;
与其他浅拷贝方式对比
concat() 和以下方法效果一致,都返回新数组、不修改原数组:
-
[...original](展开运算符) original.slice()Array.from(original)
选择 concat() 的常见场景是:你本就要拼接其他元素,顺便完成复制,比如 original.concat(newItem) 既追加又避免修改原数组。
实际使用建议
- 纯复制用
arr.concat()完全可行,语义清晰,兼容性好(IE6+) - 避免写成
arr = arr.concat(),否则虽创建了新数组,但变量指向变了,可能影响外部引用 - 处理含对象的数组时,明确是否需要深拷贝,不要默认认为
concat能隔离所有层级


















