concat()实现浅拷贝的最简单写法是arr.concat()或[].concat(arr),它不修改原数组,返回新数组,对基本类型复制值、对引用类型复制地址,故为浅拷贝。

用 concat() 浅拷贝数组,最简单写法是:arr.concat() 或 [].concat(arr)。它不修改原数组,返回一个新数组,所有顶层元素都是原样复制(即浅拷贝)。
为什么 concat() 能实现浅拷贝
concat() 本意是合并数组,但当不传任何参数时,它会把调用者(当前数组)的所有元素依次放入新数组并返回。这个过程不涉及引用变更,只复制第一层值或引用:
- 对基本类型(如数字、字符串),复制的是实际值;
- 对对象、数组等引用类型,复制的是引用地址 —— 这就是“浅拷贝”的本质。
两种常用写法及区别
arr.concat():最简洁,推荐日常使用。[].concat(arr):等价写法,语义更明确(空数组拼接原数组),适合需要链式调用或兼容旧环境的场景。
两者效果完全一致,例如:
const a = [1, {x: 2}];
const b = a.concat();
b[1].x = 99;
console.log(a[1].x); // 99 ← 说明对象被共享,是浅拷贝
注意边界情况
- 如果原数组含
undefined或null,它们会被原样复制; - 如果原数组是稀疏数组(如
[1, , 3]),concat()会保留空位; - 不能拷贝数组的自定义属性(如
arr.custom = 'yes'),只复制索引项。
和其他浅拷贝方式对比
相比 slice()、[...arr]、Array.from(arr),concat() 的优势在于语义清晰(“拼一个新数组”)、无参数时无需记忆特殊语法,且在早期 JavaScript 中兼容性极好(IE6+ 支持)。缺点是略慢于展开运算符(现代引擎优化更好),但日常开发中差异可忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











