浅拷贝仅复制对象第一层属性,引用类型共享堆内存地址;深拷贝递归复制所有层级,在堆中为每个嵌套对象创建独立副本,新旧对象完全隔离。

区分浅拷贝和深拷贝,关键看对象在内存中是否被真正“分开”——不是看代码写了几行,而是看堆(Heap)里有没有多出一份独立的数据。
栈里存什么,决定了拷贝的起点
基本类型(string、number、boolean、null、undefined、symbol、bigint)直接存在栈内存里,变量名就等于值本身。赋值时复制的是实实在在的数值,天然独立,不涉及深浅问题。
引用类型(object、array、date、regexp、function 等)的变量名存在栈里,但栈里只存一个地址——指向堆内存中真实数据的指针。这个地址才是拷贝操作真正传递的东西。
浅拷贝:只在栈里配了一把新钥匙
它新建一个对象,把原对象第一层属性的值逐个抄过去:
立即学习“Java免费学习笔记(深入)”;
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 遇到基本类型值(如
name: '张三'),就真复制一份值,放进新对象里; - 遇到引用类型值(如
address: { city: '杭州' }),只复制那个地址指针,新旧对象的address指向堆中同一块内存。
结果是:外层独立,内层共用。改 newObj.address.city,原对象也会变。
深拷贝:在堆里重新盖一栋楼
它不只是复制第一层,而是顺着每个引用地址一路往下找,每遇到一个对象或数组,就在堆内存中新开辟一块空间,把它的内容(包括内部嵌套的所有层级)完整重建一遍。
最终两个对象:栈里有各自的地址指针,堆里有各自独立的数据副本。彼此修改互不影响,因为它们根本不在同一个物理位置上。
一句话定位差异
浅拷贝让新旧对象共享堆内存中的子对象;深拷贝确保所有层级的对象都在堆中拥有专属副本。判断依据不是语法,而是打开浏览器开发者工具的 Memory 面板——你能看到两份独立的堆分配,才是真正的深拷贝。

















