千锋大数据开发学院|不可变数据之Immutable

北京联盟_本文原题为:不可变数据之Immutable
在讲不可变数据(ImmutableData)前 , 先说说可变数据(MutableData),在原生js中创建的数据都是可变的 , 如:
vara={qty:1}
a.qty=10;
可能有小伙伴说 , 可以用const啊 , const对基本数据类型还行 , 但对引用数据类型根本没辙 , 如
consta={qty:1}
a.qty=10;
a.qty;//10
如果把对象a赋值给其它变量还会导致新的问题 , 如:
consta={qty:1}
constb=a;
a.qty=10;
b.qty;//10
这时你会发现 , 修改了a , b的值也跟着改了 , 这其实是js采用引用赋值的方式来实现数据共享的 , 好处就是节省内存 , 但缺点也显而易见 , 稍微不注意就会导致改A坏B的棘手问题 , 在复杂的项目中 , 这种问题还不易排查 , 有诸多安全隐患 。
之前的做法是 , 利用深拷贝的方式来解决这个问题 , 虽然问题解决了 , 但又会引发新的问题:浪费内存 , 还有对一些需要频繁更新数据又有高性能要求的场景(如:React) , 深拷贝实则为一个不明智的操作 , 于是 , Imutable.js的出现就是要解决这些开发痛点的 。
Immutable.js由Facebook工程师LeeByron花费3年时间打造 , 在js中的引用赋值可以节省内存 , 但随着应用的不断复杂后 , 状态的改变往往会变成噩梦 , 通常的做法是复制数据来避免被修改 , 但这样又造成了CPU和内存的消耗 , 而Immutable利用结构共享可以很好地解决这些问题 。
不可变数据:ImmutableData
ImmutableData是一旦创建 , 就不能再被更改的数据 。 对Immutable对象的任何修改或添加删除操作都会返回一个新的Immutable对象 。 Immutable实现的原理是PersistentDataStructure(持久化数据结构) , 也就是对于不需要改变的数据采用结构共享的方式 , 如下图
<!--![持久化数据结构](./img/immutable.js结构共享.webp"持久化数据结构")-->
千锋大数据开发学院|不可变数据之Immutable
文章图片
常用数据类型
List:有序索引集 , 类似JS中的Array 。 Map:无序索引集 , 类似JS中的Object 。 OrderedMap:有序的Map , 根据数据的set()进行排序 。 Set:没有重复值的集合 。 OrderedSet:有序的Set , 根据数据的add进行排序 。 Stack:有序集合 , 支持使用unshift()和shift()添加和删除 。 Record:一个用于生成Record实例的类 。 类似于JavaScript的Object , 但是只接收特定字符串为key , 具有默认值 。 Seq:序列 , 但是可能不能由具体的数据结构支持 。 Collection:是构建所有数据结构的基类 , 不可以直接构建 。正如你看到的 , immutable.js的数据类型有很多 , 本文主要介绍比较常用的List和Map , 对应于js中的数组和对象 。
js与immutable之间的转换
可通过fromJS()和toJS()两个方式实现js和immuatble数据的转换 , 如:
importImmutablefrom'immutable';
constgoods={name:'huaweimate30pro',price:5998,brand:'huawei'}
//js->immutabledata
constimData=https://pcff.toutiao.jxnews.com.cn/p/20200914/Immutable.fromJS(goods)
//immutabledata->js
imData.toJS()
但fromJS()和toJS()会深度转换数据 , 随之带来的开销较大 , 尽可能避免使用 , 单层数据转换应直接使用Map()和List()进行转换 。 另外 , 还可以直接通过JSON.stringify()对immutable数据转换也json字符串 。
import{Map,List}from'immutable';
【千锋大数据开发学院|不可变数据之Immutable】constinitState=Map({
breadcrumb:List([]),
user:Map({}),
manageMenuStatus:false
})
操作immutable数据


推荐阅读