对象解构本身不是拷贝操作,仅提取值;单独解构(如const {a,b}=obj)不生成新对象,基本类型被复制,引用类型共享内存;而扩展运算符{...obj}才生成新对象,属浅拷贝。

对象解构本身不是拷贝操作,但它在特定写法下会表现出浅拷贝的行为;关键要看你是否用它创建了新对象,以及新对象的属性值是否包含引用类型。
解构赋值默认不产生新对象,只是提取值
单纯解构不会复制对象,只是把原对象的属性值“拿出来”赋给变量:
- 基本类型值(如字符串、数字)被真正复制,后续修改变量不影响原对象
- 引用类型值(如嵌套对象、数组)只复制引用地址,修改其内部属性仍会影响原对象
例如:
const obj = { a: 1, b: { c: 2 } };<br>const { a, b } = obj; // 解构:a 是 1(新副本),b 是 {c: 2} 的引用<br>b.c = 99;<br>console.log(obj.b.c); // 输出 99 —— 原对象被改了
用解构“构造新对象”时才等效于浅拷贝
当配合对象字面量使用解构,比如 {...obj},这时才生成一个新对象,且行为等同于浅拷贝:
- 第一层属性被复制,新旧对象内存地址不同
- 但所有引用类型的属性(如
obj.nested)仍共享同一份内存
例如:
const obj = { x: 1, y: [10, 20], z: { w: 'hello' } };<br>const copy = { ...obj }; // 等效于 Object.assign({}, obj)<br>copy.x = 99; // 不影响 obj.x<br>copy.y.push(30); // obj.y 也变成 [10, 20, 30]<br>copy.z.w = 'hi'; // obj.z.w 也变成 'hi'
区分核心看两点
判断一个操作是不是浅拷贝,不用管它叫什么语法,只看两个事实:
-
是否生成了新对象(
copy !== original为 true) - 修改新对象的嵌套引用属性,是否波及原对象
解构单独使用(const {a,b} = obj)不满足第一条,不算拷贝;{...obj} 满足第一条但不满足第二条(嵌套仍共用),就是标准浅拷贝。
常见误区提醒
很多人以为“用了解构就是深拷贝”,其实完全相反:
-
const {...rest} = obj—— 这是无效语法,解构不能直接写在花括号里当表达式 -
const newobj = {...obj, ...another}—— 这才是浅拷贝合并,不是深拷贝 -
JSON.parse(JSON.stringify(obj))才是常用简易深拷贝,但有类型限制











