深拷贝与浅拷贝的本质差异在于对引用类型数据的内存处理:浅拷贝仅复制第一层引用地址,新旧对象共享堆内存中的深层数据;深拷贝则递归重建所有层级的堆内存数据,实现完全独立的物理隔离。

深拷贝与浅拷贝的本质差异,就体现在内存中对引用类型数据的处理方式上——一个复制地址,一个重建数据。
基本类型不涉及“深浅”,只有值拷贝
String、Number、Boolean、null、undefined、Symbol、BigInt 这些基本类型都直接存在栈内存里。赋值时复制的是实际的值,新旧变量完全独立,不存在共享或影响问题。所以“深浅拷贝”这个概念对它们根本不适用。
浅拷贝:只复制第一层引用地址
浅拷贝创建一个新对象,把原对象第一层属性的值照搬过去。基本类型属性被真正复制;但遇到对象、数组等引用类型,拷贝的只是它在栈中存的那个地址,新旧对象仍指向堆内存中的同一块数据。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 常见方式:Object.assign()、扩展运算符 {...obj}、Array.prototype.slice()、Array.from()
- 后果:修改嵌套对象的属性(如 copy.info.name = 'Tom'),原对象对应位置也会变
- 根本原因:堆内存未被复制,两个对象共用同一份深层数据
深拷贝:为每一层引用类型分配新堆空间
深拷贝会递归遍历整个对象结构,遇到任何引用类型,都在堆内存中新开辟一块空间,把原始数据完整复制进去。新对象和原对象从根到叶,没有任何内存地址重叠。
- 可靠方式:structuredClone()(现代浏览器)、Lodash 的 _.cloneDeep()
- 受限方式:JSON.parse(JSON.stringify(obj)) —— 会丢掉 function、undefined、Symbol、Date、RegExp、循环引用等
- 关键效果:改 copy.settings.theme 不会影响 original.settings.theme,因为它们是两份物理隔离的数据
为什么浅拷贝容易导致意外修改?
因为 JavaScript 的引用类型变量本身只存指针。浅拷贝没切断这个指针链路,就像给同一间房配了两把钥匙。你用新钥匙开门调了空调温度,屋里人立刻感受到——不是你动了“副本”,而是你动了“同一个实体”。深拷贝相当于按原样再造了一整栋楼,连地砖编号都不一样。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










