一文学会!什么是Immutable

本文详细介绍了Immutable数据的概念,包括其优点如降低复杂度、节省内存、方便回溯、适合函数式编程和提供丰富的API。讲解了在React中使用Immutable优化组件渲染,以及结合Redux的使用示例,强调了使用Immutable需要注意的点,并指出其在应用优化中的重要性。
摘要由CSDN通过智能技术生成

1. 什么是 Immutable ?

Immutable Data 就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。主要原理是采用了 Persistent Data Structure(持久化数据结构),就是当每次修改后我们都会得到一个新的版本,且旧版本可以完好保留,也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),就是对于本次操作没有修改的部分,我们可以直接把相应的旧的节点拷贝过去,这其实就是结构共享。

2. Immutable 有什么优点?

2.1 降低复杂度,避免副作用

在 Javascript 中,对象都是引用类型,在按引用传递数据的场景中,会存在多个变量指向同一个内存地址的情况,这样会引发不可控的副作用,如下代码所示:

 
  • let obj1 = { name: '张三' };
  • let obj2 = obj1;
  • obj2.name = '李四';
  •  
  • console.log(obj1.name); // 李四

使用 Immutable 后:

 
  • import { Map } from 'immutable';
  • let obj1 = Map({ name: '张三'});
  • let obj2 = obj1;
  • obj2.set({name:'李四'});
  • console.log(obj1.get('name')); // 张三

当我们使用 Immutable 降低了 Javascript 对象 带来的复杂度的问题,使我们状态变成可预测的。

2.2 节省内存

Immutable 采用了结构共享机制,所以会尽量复用内存。

 
  • import { Map } from 'immutable';
  • let obj1 = Map({
  • name: 'zcy',
  • filter: Map({age:6})
  • });
  • let obj2 = obj1.set('name','zcygov');
  • console.log(obj1.get('filter') === obj2.get('filter')); // true
  • // 上面 obj1 和 obj2 共享了没有变化的 filter 属性

2.3 方便回溯

Immutable 每次修改都会创建一个新对象,且对象不变,那么变更的记录就能够被保存下来,应用的状态变得可控、可追溯,方便撤销和重做功能的实现,请看下面代码示例:

 
  • import { Map } from 'immutable';
  • let historyIndex = 0;
  • let history = [Map({ name: 'zcy' })];
  • function operation(fn) {
  • history = history.slice(0, historyIndex + 1);
  • let newVersion = fn(history[historyIndex]);
  • // 将新版本追加到历史列表中
  • history.push(newVersion);
  • // 记录索引,historyIndex 决定我们是否有撤销和重做
  • historyIndex++;
  • }
  • function changeHeight(height) {
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值