JavaScript展开语法(...)用于数组时铺平元素实现拼接、插入等操作,用于对象时浅层合并属性并后覆盖前;两者均只作用于第一层,不支持null/undefined直接展开。

JavaScript 中的展开语法(Spread Syntax)用三个点 ... 表示,能简洁地合并数组和对象,但两者行为不同:数组展开会“铺平”元素,对象展开会“浅层合并”属性。
合并数组:按顺序拼接,支持多个展开
数组展开把一个数组的每一项作为独立元素插入到新数组中,常用于拼接、添加元素或解构后重组。
- 基础拼接:[...arr1, ...arr2] 直接合并两个数组
- 开头/中间/结尾插入:[0, ...arr, 99] 把 arr 的元素放在中间
- 去重合并(配合 Set):[...new Set([...arr1, ...arr2])]
- 注意:展开只处理一层,[[1,2], ...[3,4]] 得到 [[1,2], 3, 4],不是扁平化
合并对象:同名属性后覆盖,仅浅拷贝
对象展开把源对象的可枚举自有属性复制到新对象里。多个对象展开时,靠后的同名属性会覆盖前面的。
- 基础合并:{ ...obj1, ...obj2 },obj2 中的属性会覆盖 obj1 同名属性
- 添加/覆盖单个属性:{ ...obj, name: 'Alice', id: 123 }
- 注意:只复制一层属性,嵌套对象不会被深拷贝;obj.nested 仍是原引用
- 不能展开 null 或 undefined,会报错;可用 { ...(obj ?? {}) } 安全处理
常见误区与替代方案
展开语法方便但有边界,有些场景需换方法:
- 想深合并对象?展开做不到,要用 structuredClone()(现代环境)或递归函数/Lodash 的 merge()
- 想扁平化多维数组?arr.flat() 或 arr.reduce((acc, val) => acc.concat(val), []) 更合适
- 旧浏览器不支持展开?可用 Array.prototype.concat() 或 Object.assign() 替代(但语法更冗长)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











