immutable.js理解

简介: immutable.js理解

它内部实现了一套完整的持久化数据结构 还有些自己特有的易用数据类型 List 类似于Array Map 类似于 Object   还有像map get set 这些函数操作  同时API 也尽量与原生JS的Object和Array类似

       1. Immutable的Data对象一旦创建,就不能再被更改的数据 对Immutable对象的任何修改 添加删除操作都会返回一个全新的immutable对象

  2. immutable实现原理是持久化数据结构 也就是使用旧数据创建新数据的时候,要保证旧数据同时可用且不变

       3. 为了避免深拷贝时把所有节点都复制一遍带来的性能消耗,immutable使用了共享结构,即如果对象树种一个节点发生变化,只修改这个节点和受它影响的父节点,其子节点则进行共享

(也就是说一个节点被修改 则只对受到修改值影响的这个值的父节点进行修改 修改的值的子节点不变)


特点:      

       1.持久化数据结构

       2. 共享结构

       3. 速度快,用时短      

(immutable的fromJS方法在进行深拷贝时 是比JSON.parse(JSON.stringify()) 速度要快的)

immutable的fromJS方法 将一个js数据转换成immutable数据

immutable的toJS则是将immutable数据转成JS数据


获取值

const obj1 = Immutable.fromJS({a: 1, b: 2, c: {d: 3, e: 4}});
let b = obj1.get('b');
let d = obj1.getIn(['c', 'd']); // 嵌套值获取方式


const obj1 = Immutable.fromJS({a: 1, b: 2, c: {d: 3, e: 4}});
// 修改单个值
const obj2 = obj1.set('b', 5);  // ({a: 1, b: 5, c: {d: 3, e: 4}})
// 连写set修改同级多个值
const obj3 = obj1.set('a', 6).set('b', 5);  // ({a: 6, b: 5, c: {d: 3, e: 4}})
// merge修改多个值
const obj4 = obj1.merge({a: 6, b: 5}); // ({a: 6, b: 5, c: {d: 3, e: 4}})
// getIn修改嵌套的值
const obj5 = obj1.setIn(['c', 'd'], 6); // ({a: 1, b: 2, c: {d: 6, e: 4}})

   优点:

               1. 相比js的深拷贝Immutable性能更好

                2. 节省内存空间 Immutable可以进行结构共享 会尽量的去复用内存

                3. 随意穿梭 因为每次的数据都一样 把这次数据保存起来或放到数组中可以进行回退操作

                4. 函数式编程 相比面向对象编程更适于前端开发 只要输入一致 得到结果就一定一致 更易于组件组装和调试


       缺点:

                1. 学习成本高

                2. 需要额外引入资源文件

                3. 使用过程中容易和原生js对象混淆

       什么时候用Immutable比较好?

                       如果项目中有很大的深拷贝需求量 可以使用Immutable 还有例如上述说的Immutable优点中可以因为每次操作后的数据都是不一样的 可以做回退撤销功能的操作  

相关文章
|
6月前
|
存储 安全 BI
硬盘有坏道怎么办?硬盘坏道如何屏蔽?
本文简单介绍一下坏道的类型,然后介绍检测工具、坏道屏蔽方法,感兴趣的用户可以尝试。
|
2月前
|
JSON NoSQL 测试技术
从手动到全自动:我们如何用Dify重构了API回归测试流程
本文分享团队如何借助Dify工作流平台,将耗时3天的手动API回归测试升级为3小时完成的全自动流程,实现测试效率与质量双提升,推动测试从成本中心向价值创造转型。
|
前端开发 JavaScript 开发者
工程化(webpack+vite)
在现代前端开发中,工程化是提高开发效率和项目质量的关键。UniApp 结合 Webpack 和 Vite,提供强大的工程化支持。Webpack 功能强大,支持复杂项目的构建;Vite 则利用现代浏览器的 ESM 特性,提供快速的开发体验。开发者可根据项目需求选择合适的工具,显著提升开发效率和项目质量。
|
监控 安全 Java
Java与物联网:连接与控制设备
Java与物联网:连接与控制设备
1223 0
|
数据采集 机器学习/深度学习 算法
Python实现LightGBM分类模型(LGBMClassifier算法)项目实战
Python实现LightGBM分类模型(LGBMClassifier算法)项目实战
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
262 0
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】TensorFlow简介,应用场景,使用方法以及项目实践及案例分析,附带源代码
TensorFlow是由Google Brain团队开发的开源机器学习库,广泛用于各种复杂的数学计算,特别是涉及深度学习的计算。它提供了丰富的工具和资源,用于构建和训练机器学习模型。TensorFlow的核心是计算图(Computation Graph),这是一种用于表示计算流程的图结构,由节点(代表操作)和边(代表数据流)组成。
714 0
|
前端开发 Java Spring
Spring MVC 请求处理流程
Spring MVC 请求处理流程
167 0
|
Kubernetes Java Docker
使用Kubernetes部署Spring Boot应用的实践
使用Kubernetes部署Spring Boot应用的实践
|
前端开发 开发者
高阶组件和Hooks
高阶组件和Hooks
327 0