lodash-cloneDeep

lodash是一个JavaScript工具库

Lodash的主要特点

  1. 丰富的工具函数:包含200多个函数,涵盖数组、对象、函数、字符串等多种数据类型的操作
  2. 模块化设计:支持按需导入,减少项目体积
  3. 性能优化:经过精心优化的实现,提供高效的操作体验
  4. 跨框架兼容:适用于原生JavaScript、jQuery应用程序以及基于npm的框架如Angular、React和Vue.js

cloneDeep函数

cloneDeep是Lodash库中的一个深拷贝函数,用于创建对象的深度副本。与JavaScript的浅拷贝不同,深拷贝会递归地复制对象的所有嵌套属性,确保原对象和拷贝对象完全独立,修改一个不会影响另一个。

示例

javascript 复制代码
import { cloneDeep } from 'lodash';

const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };
const deepCopy = cloneDeep(original);

// 修改嵌套属性
shallowCopy.b.c = 3;
console.log(original.b.c); // 输出: 3 (浅拷贝影响原对象)

deepCopy.b.c = 4;
console.log(original.b.c); // 输出: 3 (深拷贝不影响原对象)
console.log(deepCopy.b.c); // 输出: 4

这段JavaScript代码的执行结果如下:

// 第一个输出:修改浅拷贝的嵌套属性会影响原对象

console.log(original.b.c); // 输出: 3

// 第二个输出:修改深拷贝不会影响原对象

console.log(original.b.c); // 输出: 3

// 第三个输出:深拷贝是独立的对象

console.log(deepCopy.b.c); // 输出: 4

代码解析

  1. 对象创建

const original = { a: 1, b: { c: 2 } };

创建了一个嵌套对象,b 属性指向另一个对象 { c: 2 }。

  1. 浅拷贝

const shallowCopy = { ...original };

展开运算符 ... 创建的是浅拷贝(shallow copy):

• 第一层属性(a 和 b)被复制

• 但属性值如果是对象,复制的是引用而不是对象本身

• 所以 shallowCopy.b 和 original.b 指向同一个对象

  1. 深拷贝

const deepCopy = cloneDeep(original);

lodash 的 cloneDeep 创建的是深拷贝(deep copy):

• 递归复制所有层级

• deepCopy 和 original 完全独立,没有任何引用关系

  1. 修改的影响

// 修改浅拷贝的嵌套属性

shallowCopy.b.c = 3; // 这也会修改 original.b.c

console.log(original.b.c); // 3 ✅ 被影响

// 修改深拷贝的嵌套属性

deepCopy.b.c = 4; // 这不会影响 original.b.c

console.log(original.b.c); // 3 ✅ 保持不变

console.log(deepCopy.b.c); // 4 ✅ 只修改了深拷贝

内存示意图

修改前:


关键知识点

  1. 浅拷贝的陷阱:

    • 展开运算符 {...obj}、Object.assign()、数组的 slice() 都是浅拷贝

    • 只复制第一层,嵌套对象仍然是引用共享

  2. 深拷贝的方法:

    • JSON.parse(JSON.stringify(obj)):简单但有限制(不能处理函数、循环引用等)

    • lodash.cloneDeep():功能完整的深拷贝

    • 手动递归复制

  3. 实际应用建议:

    • 如果确定对象没有嵌套,用浅拷贝

    • 如果有嵌套且需要完全独立,用深拷贝

    • 在React/Vue中修改状态时特别注意这个区别

在代码中使用cloneDeep可以避免由于对象引用导致的意外修改,确保数据的安全性和一致性。

相关推荐
江屿风10 小时前
【Plain Language Large Model】【从浏览器到全栈:一课精通Node.js三剑客】流食般投喂
笔记·前端框架·npm·node.js·js·npx
无巧不成书02184 天前
Tomcat部署JSP文件完整指南:手动部署+IDEA工程化实现 附404访问错误全排查
java·ide·windows·tomcat·intellij-idea·js
骑着蜗牛撵大象3277 天前
语音变分录、规则挡幻觉:拆解开源 AI 记账系统 Smart Ledger 的全栈设计
人工智能·ai·架构·js·数据校验
ratel️7 天前
小墨析 · Office Agent 日常办公不烧心
python·langchain·word·excel·fastapi·js·ppt
落花看风雪9 天前
从零开始搭建后台系统(vue3+TypeScript+Vite)01
typescript·vue·js
逆风优雅15 天前
nestjs middleware 接口请求日志
后端·js
请为小H留灯21 天前
Windows 本地前端项目一键运行指南:Volta+Node+pnpm + 阿里镜像完整初始化流程
前端·pnpm·node·js
大貔貅喝啤酒1 个月前
Gitea+Jenkins+Docker 搭建 Node 项目 CI/CD 自动部署完整教程
ci/cd·docker·jenkins·js·gitea
我命由我123451 个月前
CSS - CSS 媒体查询 orientation
前端·javascript·css·html·css3·html5·js
COOLMO研究AI1 个月前
Next.js App Router 中 sitemap、robots 与 canonical 的配置与排查
前端·web·js·网站优化