lodash.clonedeep 用于深拷贝,需先安装并按需引入,可递归复制对象、数组及 date、set 等原生类型,但跳过函数和 undefined,支持循环引用,不拷贝 symbol,性能敏感时应谨慎使用。

在项目中使用 lodash.cloneDeep 进行深拷贝,核心是先正确引入方法,再传入需要拷贝的原始对象或数组——它会递归复制所有嵌套层级,避免引用共享问题。
安装与引入方式
确保项目已安装 Lodash(推荐按需引入,减少包体积):
- 安装:运行
npm install lodash.clonedeep(轻量版,仅含 cloneDeep) - 按需引入(推荐):
import cloneDeep from 'lodash.clonedeep'; - 或从完整 lodash 引入:
import { cloneDeep } from 'lodash';(注意体积较大)
基本用法示例
直接传入任意复杂数据结构即可:
const original = {
name: 'Alice',
hobbies: ['reading', 'coding'],
address: { city: 'Beijing', zip: '100000' },
tags: new Set(['dev', 'js']),
date: new Date('2023-01-01')
};
const copied = cloneDeep(original);
copied.address.city = 'Shanghai';
console.log(original.address.city); // 'Beijing'(未被修改)
console.log(copied.address.city); // 'Shanghai'
支持对象、数组、Date、RegExp、Map、Set、TypedArray 等原生类型,也兼容自定义类实例(但不会调用构造函数,只复制自有属性)。
注意事项与常见坑
-
函数和 undefined 不会被序列化:cloneDeep 会跳过函数属性和 undefined 值,拷贝后对应位置为
undefined(不是保留原值) - 循环引用可安全处理:内部自动检测并重建引用关系,不会爆栈
- Symbol 属性默认不拷贝:ES2015+ 的 Symbol 键不会被复制(除非手动配置 customizer)
- 性能敏感场景慎用:对超大嵌套对象或高频调用,建议评估是否真需深拷贝,或改用更轻量方案(如结构扁平化 + immer)
替代方案参考(非必须,按需选择)
如果项目已用 immer,可用 produce({}, draft => {...}) 安全修改;简单纯对象/数组且无特殊类型,JSON.parse(JSON.stringify(obj)) 快但有局限(丢失函数、Date 变字符串、不支持 undefined/Symbol/循环引用)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











