初识Immutable.js,菜鸟总结(包含JS的基本数据类型和引用数据类型、JS的深拷贝和浅拷贝)

这几天公司的React项目中有用到Immutable,自己在对页面中的数据处理上也用到了Immutable,网上查阅相关资料后,自己做了一些实用的总结吧,参考过的一些不错的文章有:
Immutable 详解及 React 中实践Immutable 常用API简介Immutable官方文档

1.Immutable是什么?

mmutable 数据就是一旦创建,就不能再被更改的数据。对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。Immutable 实现的原理是 Persistent Data Structure [pəˈsɪstənt ˈdeɪtə ˈstrʌktʃə(r)] (持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。
2.为什么要使用Immutable


JavaScript 中的对象(object)、数组(Array)、函数(Function)一般是可变的(Mutable),因为使用了引用赋值,新的对象简单的引用了原始对象,改变新的对象将影响到原始对象。。举个例子red={a:1}; yellow = red;如果进行yellow.a=2的操作,你会发现red中的a也变成了2。可以参考:详解JS中的基本数据类型和引用数据类型JavaScript的基本数据类型和引用数据类型
虽然这样做可以节约内存,但当应用复杂后,这就造成了非常大的隐患,Mutable 带来的优点变得得不偿失。为了解决这个问题,一般的做法是使用 shallowCopy(浅拷贝)或 deepCopy(深拷贝)来避免被修改,但这样做造成了 CPU 和内存的浪费。可以参考:JavaScript 深拷贝(deep copy)和浅拷贝(shallow copy)
3.Immutable的数据类型


常用的有两种数据类型分别是:
List: 有序索引集,类似JavaScript中的Array。
Map: 无序索引集,类似JavaScript中的Object。
下面的用的比较少,很少接触:
OrderedMap: 有序的Map,根据数据的set()进行排序。
Set: 没有重复值的集合。
OrderedSet: 有序的Set,根据数据的add进行排序。
Stack: 有序集合,支持使用unshift()和shift()添加和删除。
Range(): 返回一个Seq.Indexed类型的集合,这个方法有三个参数,start表示开始值,默认值为0,end表示结束值,默认为无穷大,step代表每次增大的数值,默认为1.如果start = end,则返回空集合。
Repeat(): 返回一个vSeq.Indexe类型的集合,这个方法有两个参数,value代表需要重复的值,times代表要重复的次数,默认为无穷大。
Record: 一个用于生成Record实例的类。类似于JavaScript的Object,但是只接收特定字符串为key,具有默认值。
Seq: 序列,但是可能不能由具体的数据结构支持。
Collection: 是构建所有数据结构的基类,不可以直接构建。
4.immutable常用Api:
Immutable 常用API简介Immutable文档


参考:

阅读 751

推荐阅读