直接用 _.cloneDeep() 一行代码即可深拷贝嵌套对象、数组、日期、正则、Map、Set 等复杂结构,避免手动递归错误或 JSON 方案丢失数据;支持按需引入、CDN 快速试用,能安全处理循环引用,但函数、DOM 元素等保持引用或跳过。

直接用 _.cloneDeep() 就行,一行代码解决嵌套对象、数组、日期、正则、Map、Set 等复杂结构的深拷贝问题,避免手动递归出错或 JSON 方案丢数据。
安装与引入方式
推荐按需引入,减小包体积:
- 只用深拷贝:运行
npm install lodash.clonedeep,然后import cloneDeep from 'lodash.clonedeep'; - 已装完整版 Lodash:可解构导入
import { cloneDeep } from 'lodash'; - 浏览器中快速试用:通过 CDN 加载
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>,之后全局可用_.cloneDeep
基础用法:真正隔离修改
传入任意嵌套对象,返回完全独立的新对象,原对象不受任何影响:
const original = {
name: 'Alice',
meta: { version: 2, createdAt: new Date() },
tags: new Set(['js', 'react']),
pattern: /abc/g
};
const copied = cloneDeep(original);
copied.name = 'Bob';
copied.meta.version = 99;
copied.tags.add('ts');
console.log(original.name); // 'Alice'
console.log(original.meta.version); // 2
console.log(original.tags.size); // 2(未变)
console.log(copied.pattern instanceof RegExp); // true(正则也被正确克隆)
需要注意的边界情况
不是所有东西都会被“复制逻辑”,有些是保留引用或跳过处理:
- 函数保持原引用(不复制闭包,也不执行克隆),如需隔离上下文得额外处理
-
undefined、null、原始类型(string/number/boolean)直接返回自身,无需担心 - 循环引用能自动识别并安全处理,不会卡死或报错
- DOM 元素、
window、document等宿主对象不支持,遇到会跳过或返回空对象,建议提前过滤 -
Symbol、NaN、Infinity会被原样保留,但不影响使用
进阶:定制化拷贝行为
遇到特殊类实例或需要过滤某些字段时,可用 cloneDeepWith 配合自定义函数:
// 示例:克隆时忽略 DOM 元素的 style 属性
const customizer = (value) => {
if (value && typeof value === 'object' && 'style' in value) {
const clone = { ...value };
delete clone.style;
return clone;
}
};
const result = cloneDeepWith(someObject, customizer);
这个方式也适用于自定义类、Buffer、TypedArray 等需特殊构造逻辑的场景。


















