博客 / 詳情

返回

初識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文檔


參考:

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.