es6扩展运算符(...)是用于数组和对象浅层展开与合并的语法,支持数组拼接、对象属性覆盖、函数参数展开等,但仅限可迭代对象且不处理嵌套结构、特殊类型或深拷贝。

ES6 扩展运算符(...)是处理数组和对象合并最简洁的方式之一,但它只做浅层操作——不深入嵌套结构,也不处理函数、日期等特殊类型。
数组合并:直接展开拼接
用 ... 把多个数组“摊开”再装进新数组里,替代传统的 concat() 或 push.apply():
const arr1 = [1, 2]; const arr2 = [3, 4]; const merged = [...arr1, ...arr2]; // [1, 2, 3, 4]- 支持多个数组:
[...arr1, ...arr2, ...arr3] - 可混入其他值:
[...arr1, 5, ...arr2] - 注意:不会自动去重,重复元素照常保留;要去重需配合
Set,例如[...new Set([...arr1, ...arr2])]
对象合并:同名属性后覆盖前
把多个对象展开后合并为一个新对象,语法直观,但仅合并第一层属性:
const a = { x: 1, y: 2 }; const b = { y: 3, z: 4 }; const merged = { ...a, ...b }; // { x: 1, y: 3, z: 4 }- 顺序决定优先级:后面的对象属性会覆盖前面同名的属性
- 嵌套对象不递归合并:
a.nested和b.nested不会合并内容,而是整个被替换 - 支持动态键:
{ ...obj, [key]: value }
它不能做什么?关键限制要清楚
扩展运算符不是万能工具,这些常见需求它搞不定:
-
深拷贝:对含嵌套数组或对象的结构,
[...arr]或{...obj}仍是浅拷贝,内部引用没断开 -
深合并:比如两个对象都有
nested: { a: 1 },它不会把a合并,而是用后者整个替换前者 -
特殊值处理:
undefined、function、Date、RegExp等在 JSON 序列化中会丢失,而扩展运算符本身不处理它们
需要深操作?搭配其他方法更可靠
遇到嵌套结构或复杂数据,建议组合使用:
- 深拷贝首选
structuredClone()(现代环境支持良好) - 简单场景可用
JSON.parse(JSON.stringify(obj)),但注意它的类型限制 - 深合并需手写逻辑或借助
Object.assign()+ 递归,或使用 Lodash 的merge
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











