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

相关推荐
27669582924 天前
美团 小程序 mtgsig
python·小程序·node·js·mtgsig1.2·美团小程序·大众点评小程序
军军君0113 天前
Three.js基础功能学习十一:动画与音频
前端·javascript·3d·js·threejs·三维
刘一说14 天前
Vue3 模块语法革命:移除过滤器(Filters)的深度解析与迁移指南
前端·vue.js·js
曲幽14 天前
JavaScript流程控制:从混乱条件到优雅遍历,一次讲清如何让代码听话
javascript·web·js·for·while·if·if else
乐迁~14 天前
如何使用html2canvas和jsPDF库来解决PDF导出时分页内容截断问题(下--表格行截断处理)
pdf·js
心.c16 天前
文件上传 - 入门篇
前端·javascript·vue.js·node.js·js
可问春风_ren17 天前
前端文件上传详细解析
前端·ecmascript·reactjs·js
lcc18721 天前
JS 隐式转换和显示转换
js
winfredzhang23 天前
从零构建:基于 Node.js 的全栈视频资料管理系统开发实录
css·node.js·html·音视频·js·收藏,搜索,缩略图
38242782724 天前
JS表单验证:className与classList区别详解
js