JavaScript展开语法(...)用于合并数组和浅拷贝对象:合并时按顺序铺开元素生成新数组;对象拷贝仅限可枚举自有属性,同名属性后者覆盖,嵌套对象仍为引用,且不支持null/undefined直接展开。

JavaScript 的展开语法(...)可以快速合并数组、复制对象属性,写法简洁且可读性强。
用展开语法合并多个数组
把多个数组的元素“铺开”成独立项,再放进新数组里,就能实现合并。
- 语法:在数组字面量中使用 ...arr,把原数组每个元素展开
- 顺序决定最终位置,后展开的数组元素会追加在后面
- 不会修改原数组,返回一个全新数组
例如:
const arr1 = [1, 2];const arr2 = [3, 4];
const arr3 = [5];
const merged = [...arr1, ...arr2, ...arr3]; // [1, 2, 3, 4, 5]
用展开语法浅拷贝对象
展开对象时,会把它的**可枚举自有属性**逐个复制到新对象中,相当于一层浅拷贝。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 只复制对象自身属性,不包括原型链上的属性
- 同名属性会被后面的对象覆盖(后者优先)
- 嵌套对象仍为引用,不是深拷贝
例如:
const objA = { a: 1, b: 2 };const objB = { b: 3, c: 4 };
const mergedObj = { ...objA, ...objB }; // { a: 1, b: 3, c: 4 }
注意边界情况和常见误区
- null 和 undefined 不能直接展开,会报错;可用逻辑运算符兜底,如 { ...(obj || {}) }
- 展开非数组类数组(如 arguments、NodeList)需确保环境支持或先转数组
- 对象展开时,Symbol 属性会被复制,但 getter/setter 会被转为普通属性值(失去响应性)
- 想深拷贝请用其他方式(如 structuredClone() 或第三方库),展开语法做不到
小技巧:配合解构一起用
展开语法常和解构搭配,比如提取部分属性再合并:
const user = { name: 'Alice', age: 30, email: 'a@example.com' };const { email, ...rest } = user;
const publicUser = { ...rest, updatedAt: Date.now() }; // { name: 'Alice', age: 30, updatedAt: 171... }

















