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  數據的過濾

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM