immutable
意義
它是提供了一種不可改變的數(shù)據(jù)結(jié)構(gòu)
使用場景
js中對象都是參考類型件蚕,當(dāng)a,b都指向某個對象,通過a改變對象,發(fā)現(xiàn)b對應(yīng)的對象也改變了峻堰。解決這一問題的方式咽袜,過去的方式是deep-clone
// jQuery 中提供深拷貝
var config = $.extend(true,{},defaultConfig,initConfig)
但是深拷貝效率較低丸卷,可以使用 immutable
- 比如,頻繁操作
state
或者store
询刹,配合immutableJS
更快谜嫉,更安全,更方便 - Immutable 使用了結(jié)構(gòu)共享凹联,如果對象樹中一個節(jié)點發(fā)生變化沐兰,只修改這個節(jié)點和受它影響的父節(jié)點,其他節(jié)點進行共享
常用數(shù)據(jù)結(jié)構(gòu)
-
Map
,鍵值對集合 -
List
蔽挠,有序可重復(fù)列表 -
Set
住闯,無序不可重復(fù)的列表
優(yōu)點
- 降低 Mutable 帶來的復(fù)雜度
- 節(jié)省內(nèi)存
- 易于開發(fā)撤銷功能
- 并發(fā)安全,暫時然并卵
- 擁抱函數(shù)式編程澳淑,應(yīng)該就是面向過程式編程
缺點
- 16k大小的文件
- 容易和原生對象混淆比原,使用嚴格的命名規(guī)范進行區(qū)別,比如所有 Immutable 類型對象以
$$
開頭,并且使用Immutable.formJS
更多認識
兩個 Immutable 對象比較
- 兩個 Immutable 可以使用 '===' 進行比較偶惠,比較內(nèi)存春寿。但即使兩個對象的值是一樣的,也會返回
false
忽孽。因此可以使用Immutable.is(map1,map2)
進行比較 -
Immutable.is
比較的是兩個對象的hashCode
或者valueOf
區(qū)別
-
Object.freeze
和const,都可以達到對象被篡改的功能绑改,但他們是淺拷貝。 - 使用
freeze
后兄一,凍結(jié)對象的屬性對應(yīng)一個對象厘线,該對象依舊可以改變。 - 使用
const
則是不允許直接改變對象出革,但是改變對象的屬性是可以的
Cursor概念
當(dāng)數(shù)據(jù)嵌套非常深造壮,為了便于訪問深層數(shù)據(jù),Cursor提供了可以直接訪問深層數(shù)據(jù)的引用
// 需要引入 immutable 和 cursor
let data = Immutable.fromJS({a:{b:{c:1}}});
let cursor = Cursor.from(data,['a','b'],newData => {
// 當(dāng) cursor 或者其他 cursor 執(zhí)行update時調(diào)用
console.log(newData);
})
cursor.get('c'); // 1
cursor = cursor.update('c',x => x + 1);
cursor.get('c'); // 2