Lodash 的 _.cloneDeep() 是 JavaScript 中安全高效深拷贝的推荐方案,能正确处理嵌套对象、数组、Date、RegExp、Map、Set、循环引用等,但不拷贝函数内部状态、DOM 节点等宿主对象。

在 JavaScript 中,使用 Lodash 的 _.cloneDeep() 是实现安全、高效深拷贝最常用且推荐的方式——它能正确处理嵌套对象、数组、Date、RegExp、Map、Set、TypedArray、函数(保留引用)、循环引用等复杂场景,比手写递归或 JSON.parse(JSON.stringify()) 更健壮。
安装与引入 Lodash
确保项目中已安装 Lodash(推荐按需引入):
- npm 安装:npm install lodash.clonedeep(轻量,只含 cloneDeep)
- 或完整安装:npm install lodash
- 使用时导入:import cloneDeep from 'lodash.clonedeep';(ESM)或 const cloneDeep = require('lodash.clonedeep');(CommonJS)
基本用法:一行完成深拷贝
直接传入任意值,返回完全独立的新副本:
const original = {
name: 'Alice',
hobbies: ['reading', 'coding'],
meta: { version: 2, createdAt: new Date() },
tags: new Set(['js', 'lodash']),
config: /strict/gi
};
const copied = cloneDeep(original);
copied.name = 'Bob';
copied.hobbies.push('gaming');
console.log(original.name); // 'Alice'(未变)
console.log(original.hobbies); // ['reading', 'coding'](未变)
console.log(copied.meta.createdAt instanceof Date); // true(Date 被正确克隆)
console.log(copied.tags === original.tags); // false(Set 独立副本)
注意边界情况与常见误区
- 函数默认不拷贝内部状态:cloneDeep 会保留函数引用(即浅拷贝函数),不会复制闭包变量。如需隔离函数上下文,需额外处理
- undefined、null、原始类型(string/number/boolean)直接返回自身,符合预期,无需担心性能
- 循环引用可安全处理:Lodash 内部自动追踪引用,避免栈溢出或无限循环
- 不支持拷贝 DOM 节点、Window、document 等宿主对象,遇到会跳过或返回空对象,建议提前过滤
- 避免用 JSON.parse(JSON.stringify(obj)):会丢失 Date、RegExp、undefined、function、NaN、Infinity、Symbol 和循环引用,且 Date 变成字符串
性能优化小提示
对超大结构(如万级嵌套节点),可考虑:
立即学习“Java免费学习笔记(深入)”;
- 确认是否真需要深拷贝——有时用 immer 做不可变更新更高效
- 若数据结构固定且简单,可手写针对性浅+深混合拷贝(如只深拷某几层)
- Lodash v4+ 已针对常见类型做了底层优化,日常场景无需手动干预


















