此文僅為我對學習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 數據的過濾
