lodash 的 clonedeep 是 javascript 中最直接可靠的深拷贝方案:安装 lodash.clonedeep 后导入使用,可安全复制嵌套对象、数组、date、regexp、map、set 等复杂类型及循环引用,但无法克隆不可枚举属性、原型链属性和 symbol 键,且有性能开销。

在 JavaScript 中,用 Lodash 的 cloneDeep 做深拷贝最直接:先安装 Lodash,再导入函数,调用即可。它能安全复制嵌套对象、数组、日期、正则、Map、Set 等复杂类型,比原生方法更可靠。
安装和引入 Lodash
Lodash 是一个 npm 包,需先安装才能使用:
- 运行
npm install lodash(推荐只装需要的函数,见下条) - 为减少体积,建议按需引入:
npm install lodash.clonedeep - 代码中导入:
import cloneDeep from 'lodash.clonedeep';(ES Module)或const cloneDeep = require('lodash.clonedeep');(CommonJS)
基本用法示例
传入任意值,返回完全独立的深拷贝副本:
const original = { a: 1, b: { c: 2 } };
const copied = cloneDeep(original);
copied.b.c = 999;
console.log(original.b.c); // 2(没被修改)
console.log(copied.b.c); // 999
支持各种类型:函数、Date、RegExp、Map、Set、TypedArray、甚至循环引用对象都能正确处理。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
注意事项和常见问题
cloneDeep 不是万能的,需注意几点:
- 无法克隆不可枚举属性、原型链上的属性、Symbol 键(除非显式配置,但默认不包含)
- 会丢失原对象的 constructor(拷贝后是普通 Object 或对应包装类型,如 new Date() 拷贝后仍是 Date 实例,但自定义类实例会被降级为 plain object)
- 遇到大量数据时有性能开销,简单对象优先考虑结构化克隆(
structuredClone)或 JSON 方案(仅限可序列化数据) - 若项目已用 Webpack/Vite,Tree-shaking 能自动剔除未用函数,所以按需安装
lodash.clonedeep更轻量
替代方案对比
不是所有场景都必须用 Lodash:
-
structuredClone()(现代浏览器支持):原生、无依赖,支持 Map/Set/Date/RegExp/ArrayBuffer,但不支持函数、undefined、循环引用 -
JSON.parse(JSON.stringify(obj)):简单快捷,但会丢掉函数、undefined、Symbol、Date(变成字符串)、RegExp、NaN、Infinity,且不支持循环引用 - 自定义递归实现:适合极简需求或学习目的,但容易漏掉边界情况(如循环引用、特殊类型)
真正需要健壮深拷贝时,cloneDeep 仍是目前最成熟的选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










