扩展运算符(...)用于同类型数据的浅层合并:数组按序展开,对象后出现的同名属性覆盖前者;不可混用数组与对象;深层合并需手动实现或借助工具库。

扩展运算符(...)在 JavaScript 中用于展开数组或对象,实现简洁的合并操作。它不能直接合并不同类型(比如数组和对象混用),但对同类型数据的合并非常高效。
用扩展运算符合并数组
把多个数组“摊开”后放入新数组,顺序按展开位置决定。
- 基本写法:
const newArr = [...arr1, ...arr2, ...arr3]; - 可插入其他元素:
[...arr1, 'x', ...arr2],'x' 会出现在两个数组之间 - 注意:只做浅拷贝,嵌套数组/对象内部不会被递归复制
- 示例:
const a = [1, 2]; const b = [3, 4];<br> const c = [...a, ...b]; // [1, 2, 3, 4]
用扩展运算符合并对象
将多个对象的自有可枚举属性依次展开,**后出现的同名属性会覆盖前面的**。
- 基本写法:
const newObj = { ...obj1, ...obj2 }; - 支持添加/覆盖属性:
{ ...obj1, name: 'Alice', ...obj2 },name 和 obj2 的同名字段都会覆盖 obj1 - 仅处理第一层属性,嵌套对象不会自动合并(如
user.address不会与另一个 address 合并,而是整体替换) - 示例:
const x = { a: 1, b: 2 };<br> const y = { b: 3, c: 4 };<br> const z = { ...x, ...y }; // { a: 1, b: 3, c: 4 }
不能直接用扩展运算符合并数组和对象
语法上不允许混合类型展开,例如 [...obj, ...arr] 或 { ...arr, ...obj } 会出错或产生意外结果。
立即学习“Java免费学习笔记(深入)”;
-
[...obj]会尝试将对象转为可迭代对象,通常报错(除非对象有自定义[Symbol.iterator]) -
{ ...arr }虽不报错,但只会把数组索引作为 key 展开(如{0: 'a', 1: 'b'}),不是你想要的“合并” - 真要跨类型组合,需手动转换:比如用
Object.entries()把对象转成键值对数组,再构造新对象;或用Array.from()/Object.values()提取数据再拼接
替代方案:深合并或更复杂合并需求
扩展运算符只做浅层合并。如果需要合并嵌套结构(如两个对象都有 address: { city: 'Beijing' },希望 city 不被覆盖而是合并),就得借助工具函数或库。
- 简单深合并可递归实现,但要注意循环引用和类型判断
- 常用库如 Lodash 的
_.merge()支持真正深合并 - 现代开发中,若频繁需要深层合并,建议封装一个工具函数,避免每次手写逻辑


















