展开运算符(...)是JavaScript中实现对象浅拷贝、数组合并与函数参数透传的关键工具,语法简洁、语义清晰,但仅支持浅拷贝,嵌套对象仍共享引用。

展开运算符(...)是 JavaScript 中提升代码简洁性与可维护性的关键工具,尤其在对象浅拷贝和数组操作中效果显著。它不是万能的“深拷贝方案”,但用对了场景,能大幅减少冗余写法、避免副作用、增强可读性。
对象合并与默认配置覆盖
常见于组件配置、API 参数拼接等场景。传统写法常依赖 Object.assign() 或手动遍历赋值;展开运算符让逻辑一目了然:
- 合并多个配置对象:
const config = { ...defaults, ...userOptions, ...overrides };—— 后者属性自动覆盖前者,顺序即优先级 - 安全添加新字段而不污染原对象:
const withId = { ...data, id: generateId() }; - 剔除敏感字段再透传:
const safePayload = { ...req.body, password: undefined, token: undefined };
数组操作:合并、插入与解构替代
相比 concat()、push() 或循环拼接,展开运算符更函数式、更易组合:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 多数组合并:
const allItems = [ ...cartItems, ...wishlistItems, ...recentSearches ]; - 动态插入元素:
const newList = [ 'first', ...items, 'last' ];(比unshift()+push()更直观) - 替代
Array.from()或slice()做浅拷贝:const copy = [ ...originalArray ];—— 语义清晰,性能在现代引擎中已接近原生方法
函数调用与参数透传
当需要把数组“打散”为函数参数时,展开运算符直接替代 apply(),且支持混合写法:
立即学习“Java免费学习笔记(深入)”;
- 固定参数 + 动态列表:
Math.max(10, ...numbers)(不用Math.max.apply(null, [10].concat(numbers))) - 高阶函数参数转发:
const debounce = (fn, delay) => (...args) => setTimeout(() => fn(...args), delay); - 事件处理器中保留原始事件并追加上下文:
onClick={(e) => handler(e, ...extraProps)}
浅拷贝的边界与注意事项
展开运算符本质是浅拷贝,这点必须明确 —— 它只复制第一层引用,嵌套对象仍共享内存:
- ✅ 安全场景:对象/数组仅含原始类型(
string、number、boolean、null、undefined) - ⚠️ 风险场景:含嵌套对象或数组,如
{ user: { name: 'A', profile: { age: 25 } } }—— 修改copy.user.profile.age会同步影响原对象 - ? 补救方式:若需深层隔离,应配合
JSON.parse(JSON.stringify())(简单结构)、递归克隆函数或使用structuredClone()(现代环境,支持Date、Map、Set等)

















