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可以避免由于对象引用导致的意外修改,确保数据的安全性和一致性。

相关推荐
请为小H留灯1 小时前
Windows 本地前端项目一键运行指南:Volta+Node+pnpm + 阿里镜像完整初始化流程
前端·pnpm·node·js
大貔貅喝啤酒9 天前
Gitea+Jenkins+Docker 搭建 Node 项目 CI/CD 自动部署完整教程
ci/cd·docker·jenkins·js·gitea
我命由我1234519 天前
CSS - CSS 媒体查询 orientation
前端·javascript·css·html·css3·html5·js
COOLMO研究AI23 天前
Next.js App Router 中 sitemap、robots 与 canonical 的配置与排查
前端·web·js·网站优化
海天鹰1 个月前
在线GPX编辑器gpx.studio
js
尾善爱看海1 个月前
前端面试算法手撕全解(高频真题+标准答案)
算法·js
sunphp开发者1 个月前
明灯智慧地图导览系统制作教程
vue·php·uniapp·js·贴图
我命由我123451 个月前
JS Mock(Mock 拦截请求的前提、Mock 使用、关闭 Mock)
开发语言·前端·javascript·前端框架·html·html5·js
小小龙学IT1 个月前
第一节 QML 背景介绍
c++·qt·js
rockey6271 个月前
C#脚本引擎之AScript与Jurassic、Jint对比
javascript·c#·.net·js·script·动态脚本