zoukankan      html  css  js  c++  java
  • 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  数据的过滤

        

  • 相关阅读:
    剑指offer-重建二叉树
    Java集合学习-总体框架
    leetcode-6-ZigZag Conversion
    海拔高度与大气密度的关系函数
    C++ 获取文件夹下的所有文件名
    01-复杂度1. 最大子列和问题
    00-自测5. Shuffling Machine
    00-自测4. Have Fun with Numbers
    00-自测3. 数组元素循环右移问题
    00-自测2. 素数对猜想
  • 原文地址:https://www.cnblogs.com/kingwu/p/10018968.html
Copyright © 2011-2022 走看看