深拷贝和浅拷贝是两种数据复制行为:浅拷贝仅复制第一层结构,嵌套对象共享引用,适用于扁平结构且性能敏感场景;深拷贝递归复制全部层级,新旧对象完全独立,适用于需彻底隔离修改的复杂数据操作。

深拷贝和浅拷贝不是“技术栈”,而是两种数据复制行为,对应不同实现方式和适用场景。选哪种方式,取决于你的目标环境、数据结构复杂度和兼容性要求。
浅拷贝:只复制第一层,嵌套对象仍共享引用
适用于结构扁平、无需隔离深层修改的场景,性能轻量。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- Object.assign({}, obj):支持多源合并,不拷贝原型链和 Symbol 键,跳过 null/undefined 源
- 扩展运算符 {...obj}:语法简洁,但对 null 或 undefined 直接报错
- Array.slice() / Array.concat() / [...arr]:专用于数组,兼容性好(含 IE)
深拷贝:递归重建完整结构,新旧对象完全独立
适合需要彻底隔离、防止副作用的数据操作,但需注意类型支持与边界情况。
- structuredClone():现代浏览器(Chrome 98+、Firefox 94+、Safari 15.4+)和 Node.js 18.12+ 默认支持;能处理 Map、Set、Date、RegExp、ArrayBuffer、循环引用等,但不支持 function、undefined、Symbol
- JSON.parse(JSON.stringify(obj)):仅限纯数据对象(POJO),会丢失 function、undefined、Symbol、Date(转字符串)、RegExp(变空对象)、Map/Set、循环引用直接报错
- Lodash cloneDeep():兼容老环境,覆盖绝大多数类型(含函数克隆为 undefined),稳定可靠,适合生产环境
- 手写递归 + WeakMap 缓存:用于定制逻辑或学习原理,必须判断 Array、Date、RegExp、Map、Set 等类型,并用 WeakMap 记录已遍历对象以避免循环引用爆栈
关键区别不在“用什么库”,而在“你拷的是什么”
基本类型(string、number、boolean 等)赋值天然就是“值拷贝”,不存在深浅问题;所有深浅拷贝讨论都只针对引用类型(Object、Array 及其子类)。是否出现“改了 b,a 也变了”,本质是看嵌套层级的引用地址有没有被重新分配。
怎么选?看三点
- 项目环境是否支持
structuredClone?支持就优先用,标准、高效、安全 - 数据里有没有 function、undefined、Symbol 或自定义类实例?有就别用 JSON 方案,考虑 Lodash 或手写
- 是否要兼容 IE 或旧版 Node?那就用 Lodash,或降级为浅拷贝 + 手动处理深层字段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










