concat() 实现数组浅拷贝,返回新数组且第一层独立,但嵌套引用类型共享内存地址;基本类型修改互不影响,引用类型修改会同步原数组。

concat 是 JavaScript 中实现数组浅拷贝的一种经典方法,它不会修改原数组,而是返回一个新数组,包含原数组所有元素的副本。
concat() 如何实现浅拷贝
调用 concat() 时不传任何参数,它会把原数组的所有元素复制到一个新数组中,这个新数组与原数组在内存中是独立的(第一层独立),但内部若存在对象、数组等引用类型,其引用地址仍相同。
- 对基本类型(如数字、字符串、布尔值):新数组中值完全独立,修改互不影响
- 对引用类型(如对象、嵌套数组):新数组只是复制了引用,修改嵌套内容会影响原数组
基本用法示例
✅ 正确用法:
const arr1 = [1, 2, 3]; const arr2 = arr1.concat(); // 或 arr1.concat([]) console.log(arr2); // [1, 2, 3] console.log(arr1 === arr2); // false(不是同一个数组) arr2.push(4); console.log(arr1); // [1, 2, 3](原数组未变) console.log(arr2); // [1, 2, 3, 4]
注意嵌套对象的浅拷贝限制
⚠️ 当数组含对象时,concat 只拷贝对象引用,不是深拷贝:
const arr1 = [1, { name: 'Alice' }];
const arr2 = arr1.concat();
arr2[1].name = 'Bob';
console.log(arr1[1].name); // 'Bob'(原对象也被改了)
这是因为 concat 拷贝的是对象的内存地址,不是对象本身。如需真正隔离嵌套结构,应使用 structuredClone()、JSON.parse(JSON.stringify())(简单场景)或专门的深拷贝库。
concat vs 其他浅拷贝方式
和 slice()、[...arr]、Array.from(arr) 一样,concat() 属于安全、兼容性好的浅拷贝手段(IE9+ 支持)。它不依赖扩展运算符,适合需要兼顾老浏览器的项目。
- 推荐日常使用 [...arr](更简洁直观)
- 需要函数式链式调用时,concat() 可顺便合并其他数组:
arr1.concat(arr2, arr3) - 仅拷贝自身数组,不带额外数据时,concat() 和 slice() 效果一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











