对象解构本身不复制对象,仅提取属性赋值;浅拷贝靠扩展运算符{...obj}实现,它只复制第一层可枚举自有属性,嵌套引用仍共享内存,不保留symbol、不可枚举属性及原型链。

对象解构本身不是拷贝方法,它不会创建新对象,只是从原对象中提取属性并赋值给变量。但结合对象字面量语法 {...obj},就能实现浅层属性复制——这本质是扩展运算符的用法,不是解构本身在复制。
解构 + 扩展运算符:真正起作用的是后者
所谓“用解构实现浅拷贝”其实是常见误解。解构(如 const { a, b } = obj)只读取值、绑定变量,不生成新对象。真正完成浅层复制的是扩展运算符:{...obj}。
- 它把
obj的所有可枚举自有属性展开,拼成一个新对象 - 只处理第一层:基础类型值被复制,对象或数组等引用类型仍共享内存地址
- 跳过不可枚举属性、Symbol 键、原型链上的属性和 getter/setter
典型写法与实际效果
最常用形式是直接用扩展运算符构造新对象:
-
const copy = { ...original };—— 创建新对象,顶层属性隔离 -
const { x, y, ...rest } = original; const copy = { x, y, ...rest };—— 先解构再重组,适合筛选或重命名字段 -
const merged = { ...defaults, ...overrides };—— 合并配置,后者同名属性覆盖前者
注意:如果 original 包含嵌套对象(如 info: { age: 25 }),copy.info 和 original.info 仍指向同一对象,改 copy.info.age 会影响原对象。
和 Object.assign 的区别在哪
功能上两者等价:{...obj} 和 Object.assign({}, obj) 都只做一层复制,行为一致。
- 语法更简洁,可读性更强,尤其适合合并或解构后重建
- 不能用于非对象值(
{...null}或{...undefined}会报错;Object.assign会尝试包装原始值) - 不支持动态键名批量展开(比如想展开一个变量名数组里的属性,得靠
Object.assign或其他逻辑)
什么情况下别用它
当对象结构不确定或存在深层嵌套时,这种浅复制容易引发隐性副作用。
- 数据用于后续修改且可能触及嵌套字段 → 改用
structuredClone()(现代浏览器)或JSON.parse(JSON.stringify())(简单纯数据场景) - 需要保留 Symbol 属性、不可枚举属性或原型方法 → 它们都会丢失,此时需定制复制逻辑
- 源对象含函数、Date、RegExp、Map 等特殊类型 → 扩展运算符无法正确克隆,
structuredClone更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











