直接调用_.clonedeep()即可安全高效完成深拷贝,它能正确处理嵌套对象、数组、date、regexp、map、set等类型并自动解决循环引用;需通过npm install lodash安装,并推荐import clonedeep from 'lodash/clonedeep'方式引入,避免混用lodash-es默认导出。

直接调用 _.cloneDeep() 即可安全高效地完成深拷贝,它能正确处理嵌套对象、数组、Date、RegExp、Map、Set、TypedArray、函数(保留引用)、undefined、null 等多种类型,避免循环引用导致的栈溢出。
安装与引入 Lodash
确保项目中已正确引入 Lodash 的完整版(lodash)或按需引入(lodash.clonedeep):
- npm 安装:
npm install lodash,然后在代码中import cloneDeep from 'lodash/cloneDeep'; - 浏览器中可通过 CDN:
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>,之后全局可用_.cloneDeep - 注意:不能使用精简版
lodash-es的默认导出方式混用,推荐明确导入from 'lodash/cloneDeep'
基本用法与典型场景
传入任意复杂值,返回一个完全独立的新副本:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 普通嵌套对象:
const newObj = cloneDeep({ a: 1, b: { c: 2 } });→ 修改newObj.b.c不影响原对象 - 含 Date / RegExp:
cloneDeep({ d: new Date(), r: /abc/g })→ 返回新 Date 实例和新正则对象 - Map / Set / ArrayBuffer:
cloneDeep(new Map([['key', 'val']]))→ 返回新 Map,内容相同但不共享引用 - 遇到循环引用(如
obj.self = obj)时自动跳过重复遍历,不会报错或卡死
注意事项与常见误区
cloneDeep 强大但并非万能,需留意以下边界情况:
- 函数、Symbol 属性、原型链上的属性默认不被拷贝(函数保留原引用,Symbol 键会被忽略)
- DOM 节点、window、document 等宿主对象无法可靠克隆,调用会返回空对象或抛错
- 性能敏感场景(如每帧拷贝大型数据)应评估必要性,避免无谓开销;可考虑结构共享或 immutable 方案替代
- 若只需浅层深拷贝(如只到第二层),不要盲目用
cloneDeep,可用展开运算符或Object.assign配合手动处理
替代方案对比(简单场景可不用 Lodash)
不是所有情况都需要 Lodash:
- 纯 JSON 数据(不含函数、Date、undefined 等)→
JSON.parse(JSON.stringify(obj))更轻量,但会丢失 undefined、function、NaN、Infinity、Date 对象等 - 现代浏览器 + 简单对象 →
structuredClone()(Chrome 98+、Firefox 94+ 支持)是原生高性能方案,支持 Map/Set/Date/RegExp,且能处理循环引用 - 需要高度定制化行为(如过滤某些字段、转换特定类型)→ 可基于
cloneDeepWith自定义克隆逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










