对象解构赋值既不是深拷贝也不是浅拷贝,而是属性提取加值赋值:基本类型赋值独立,引用类型共享内存;它不创建新对象,仅读取原对象属性并分别赋值给变量。

对象解构赋值既不是深拷贝,也不是浅拷贝——它本质上是**属性提取 + 值赋值**,拷贝行为取决于被解构的属性类型。
解构赋值不创建新对象,只是读取并赋值
解构语法(如 const { name, profile } = user;)并不会生成一个“副本对象”,而是从原对象中逐个读取属性,然后按基本类型或引用类型规则分别赋值给新变量:
- 如果属性值是基本类型(字符串、数字等),解构后得到的是独立的值,修改新变量不影响原对象
- 如果属性值是引用类型(对象、数组等),解构后得到的是该值的引用地址,新变量和原对象仍指向同一块堆内存
典型例子说明行为
看这个常见场景:
let user = {name: "张三",
address: { city: "北京" }
};
const { name, address } = user;
name = "李四"; // ✅ 不影响 user.name
address.city = "上海"; // ❌ user.address.city 也变成 "上海"
这里 name 是基本类型,赋值独立;address 是引用类型,解构后仍是同一个对象的引用。
立即学习“Java免费学习笔记(深入)”;
和浅拷贝的区别在哪?
浅拷贝(如 Object.assign({}, obj) 或展开运算符 {...obj})会创建一个**新的空对象**,再把原对象第一层属性复制进去。而解构赋值连这个新容器都不创建,它只是“拆包”动作,没有目标对象,也不涉及对象层级复制逻辑。
想实现真正拷贝,得额外处理
如果需要独立副本,不能只靠解构:
- 单层对象:先解构,再用展开运算符重建
const copy = { ...user }; - 深层嵌套:需配合深拷贝手段,比如
JSON.parse(JSON.stringify(user))(注意限制)或结构化克隆structuredClone(user) - 带函数/日期/循环引用等:推荐使用
structuredClone(现代浏览器支持)或成熟库如 lodash 的cloneDeep


















