lodash 的 _.clonedeep() 是 javascript 中实现深拷贝最直接可靠的方法,支持嵌套对象、数组、日期、正则、map、set 等,但函数保留引用,不处理 dom 元素等宿主对象。

在 JavaScript 中,用 Lodash 实现深拷贝最直接的方式是调用 _.cloneDeep() 方法,它能安全处理嵌套对象、数组、日期、正则、Map、Set、函数(保留引用,不复制逻辑)、循环引用等复杂结构。
安装和引入 Lodash
确保项目中已安装 Lodash:
- npm 安装:
npm install lodash - ES 模块引入:
import { cloneDeep } from 'lodash'; - CommonJS 引入:
const { cloneDeep } = require('lodash'); - 浏览器中可通过 CDN:
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>,之后全局可用_.cloneDeep
基本用法示例
只需传入原始值,返回一个完全独立的新副本:
const obj = {
a: 1,
b: { c: 2, d: [3, 4] },
e: new Date(),
f: /test/g
};
const copied = _.cloneDeep(obj);
copied.b.c = 999;
console.log(obj.b.c); // 2(原对象未变)
console.log(copied.b.c); // 999
注意深拷贝的边界情况
_.cloneDeep() 虽强大,但仍有几点需留意:
- 函数、Symbol、undefined、NaN、Infinity 等会被原样复制(函数仍是同一引用,不执行克隆)
- DOM 元素、window、document 等宿主对象行为未定义,不建议深拷贝
- 自定义类实例默认只拷贝可枚举属性,不会调用构造函数或原型方法;如需特殊处理,可配合
customizer参数定制 - 性能开销比浅拷贝大,高频或大数据量场景需评估必要性
替代方案与对比
不用 Lodash 时,常见替代有:
-
JSON.parse(JSON.stringify(obj)):简单但不支持函数、undefined、Date、RegExp、循环引用等,且会丢失原型链 - structuredClone()(现代浏览器):原生支持,兼容性有限(Chrome 98+、Firefox 94+),不支持函数和某些内置对象
- 手写递归实现:可控但易出错,尤其对循环引用、类型判断、不可枚举属性等处理复杂
Lodash 的 cloneDeep 在兼容性、健壮性和易用性上仍是生产环境首选。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











