扩展运算符(...)和 Object.assign() 都实现浅拷贝,仅复制第一层属性,嵌套对象仍共享引用;前者语法简洁适合现代环境,后者兼容性好且支持多对象合并。

JavaScript 中浅拷贝一层属性,扩展运算符(...)和 Object.assign() 是最常用、最直观的两种方式。它们都只复制对象第一层的属性值,对嵌套对象或数组仍共享引用。
用扩展运算符实现浅拷贝
语法简洁,适合对象字面量场景,也常用于函数参数解构或合并新旧配置:
- 直接展开原对象生成新对象:
const newObj = { ...oldObj }; - 支持在拷贝时添加/覆盖属性:
const newObj = { ...oldObj, name: 'Alice', age: 30 }; - 注意:仅展开可枚举、自有属性;不可枚举属性、原型链上的属性、symbol 键(除非显式列出)不会被拷贝
用 Object.assign 实现浅拷贝
兼容性更好(支持 IE9+),适合需要动态目标对象或批量合并多个源对象的场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 第一个参数是目标对象(通常传空对象避免污染):
const newObj = Object.assign({}, oldObj); - 可一次合并多个对象:
Object.assign({}, obj1, obj2, obj3),后者属性会覆盖前者同名属性 - 同样只处理自有可枚举属性;如果目标对象非空,会修改它本身(所以推荐始终用
{}作第一参数)
两者都只做一层拷贝 —— 关键提醒
无论用哪种方式,遇到嵌套对象或数组,拷贝的仍是引用,不是新副本:
立即学习“Java免费学习笔记(深入)”;
const a = { user: { name: 'Bob' }, tags: ['js'] };-
const b = { ...a };或const b = Object.assign({}, a); - 此时
b.user === a.user为 true,b.tags === a.tags也为 true - 修改
b.user.name或b.tags.push('web'),原始对象a也会同步变化
什么时候选哪个?
日常开发中优先用扩展运算符:更简洁、可读性强、支持解构与默认值;需要兼容老环境或需合并多个动态对象时,用 Object.assign 更稳妥。两者效果完全等价,只是写法和适用场景略有不同。

















