immutable

此文仅为我对学习immutable后进行一些总结,结果可能会不太全面,仅为个人理解,若有错误,请大家海涵,也烦请大家指出

Immutable

1、 Immutable JavaScript 的不可变集合

  JavaScript中的对象一般是可变的(mutable),因为使用了引用赋值,新的对象引用了原始的对象,新对象的改变也会引起原始对象的改变,虽然这样可以节约内存,但当应用复杂以后,就造成非常大隐患。Immutable可以很好的解决这个问题。

 

       Immutable,JavaScript的不可变集合,对immutable对象进行任何修改或删除操作都会返回一个新的immutable对象,Immutable实现的原理是Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据可用且不变,避免把所有数据复制一遍带来的性能损耗,immutable使用了Structure Sharing(结构共享),即对象中的一个节点发生改变,只修改这个节点和受它影响的父节点,其他节点进行共享。

 

      immutable提供了许多不可变的数据结构,

 

    a)      List: 有序索引集,类似JavaScript中的Array。

 

    b)     Map: 无序索引集,类似JavaScript中的Object。

 

    c)      OrderedMap: 有序的Map,根据数据的set()进行排序。

 

    d)     Set: 没有重复值的集合。

 

    e)      OrderedSet: 有序的Set,根据数据的add进行排序。

 

    f)       Stack: 有序集合,支持使用unshift()和shift()添加和删除。

 

    g)     Record: 一个用于生成Record实例的类。类似于JavaScript的Object,但是只接收特定字符串为key,具有默认值。

 

    h)     Seq: 序列,但是可能不能由具体的数据结构支持。

 

    i)       Collection: 是构建所有数据结构的基类,不可以直接构建。

 

    优点:

 

           降低了mutable带来的复杂度

 

           节省内存空间(数据复用)

 

      函数式编程

 

         缺点:

 

                容易与原生对象混淆

 

         解决办法:

 

                使用Flow、TypeScript这类有静态类型检查的工具

 

  使用immutable.fromJS来创建对象,避免使用.Map、.List而造成和原生对象的混用

 

       与Object.freeze、const区别

 

    Object.freeze和ES6中的const都可以防止对象被篡改,但是它们是shallowCopy(浅拷贝)的,对象层数一深,就要特殊处理

 

2、 比较

  a)       equals : map数据之间的比较,如果比较的第二个数据是从第一个进行set操作或赋值操作进行同值覆盖,则‘==’的结果为true

  b)       is() : 值相等检查,语义类似于Object

3、 merge() : 将map类型数据和普通对象进行合并(merge),返回值为map对象

         List类型数据合并(concat)则返回List数据类型

4、 seq() : seq描述了一个惰性操作,seq是不可更改的,seq允许有效的链式操作,seq通常用于给JaveScript Object提供丰富的集合API

5、 Range

  返回从start到end(不包括) 的数值

  const aRange = Range(1, 2000)

6、 Set()

  ==>  

 

7、 API

  a)       flip() : 将对象中的key、value进行互换

  b)       filter() : 过滤

  c)        get() : 返回与提供键相关联的值

  d)       toObject() : 将map对象转换为Object

  e)       toArray() : 将每一个key、value为一个数组

  f)         getIn() : 返回从提供的集合开始提供的键路径的值,若未定义键路径,则返回undefined

  g)       set() : 返回集合的副本,其中key的值设置为提供的值

    两个值对统一map数据进行相同的set操作后,两个值进行纯比较不相等

  h)       toJS() : 将List类型数组转换为纯数组

   ==>  

  i)         mergeDeep()

    返回集合副本,其余集合深入递归合并,根据递归的层次,若这一层中存在则进行替换,不存在则进行添加

    

       ==>

    

  j)  groupBy  数据的过滤

 

    

posted @ 2018-11-26 10:34  全被使用让我怎么起?  阅读(2228)  评论(0编辑  收藏  举报