這幾天公司的React項目中有用到Immutable,本身在對頁面中的數據處理上也用到了Immutable,網上查閱相關資料後,本身作了一些實用的總結吧,參考過的一些不錯的文章有:
Immutable 詳解及 React 中實踐,Immutable 經常使用API簡介,Immutable官方文檔html
mmutable 數據就是一旦建立,就不能再被更改的數據。對 Immutable 對象的任何修改或添加刪除操做都會返回一個新的 Immutable 對象。Immutable 實現的原理是 Persistent Data Structure [pəˈsɪstənt ˈdeɪtə ˈstrʌktʃə(r)] (持久化數據結構),也就是使用舊數據建立新數據時,要保證舊數據同時可用且不變。同時爲了不 deepCopy 把全部節點都複製一遍帶來的性能損耗,Immutable 使用了 Structural Sharing(結構共享),即若是對象樹中一個節點發生變化,只修改這個節點和受它影響的父節點,其它節點則進行共享。
2.爲何要使用Immutablegit
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的數據類型github
經常使用的有兩種數據類型分別是:
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文檔segmentfault
參考:數組