immutable.js 和 immer

不可變數(shù)據(jù)類型

immutable或辖,副作用笆檀,純函數(shù)關(guān)鍵詞解釋:

  • immutable: 不可變數(shù)據(jù)
  • 副作用:調(diào)用函數(shù),同時(shí)對(duì)主函數(shù)產(chǎn)生了附加的影響尺铣,比如修改全局變量拴曲,改變參數(shù)。
    如何避免凛忿,創(chuàng)建不可變數(shù)據(jù)類型澈灼,在一次更新過程中不應(yīng)該改變?cè)袑?duì)象,需要返回一個(gè)新的對(duì)象
  • 純函數(shù):無副作用的函數(shù)

js 中的對(duì)象一般是可變的店溢,因?yàn)槭褂昧艘觅x值叁熔,雖然可以節(jié)約內(nèi)存,但是會(huì)有一些隱患逞怨。一般做法使用淺拷貝和深拷貝來避免修改者疤,但是這樣會(huì)造成 CPU 和內(nèi)存浪費(fèi)。

為了解決這個(gè)問題叠赦,出現(xiàn)了 immutable.js 和 immer

immutable.js 庫

immutable.js 實(shí)現(xiàn)原理:Persistent Data Structure(持久化數(shù)據(jù)結(jié)構(gòu))驹马。

  • 使用舊數(shù)據(jù)創(chuàng)建新數(shù)據(jù)時(shí),要保證舊數(shù)據(jù)同時(shí)可用且不變除秀。同時(shí)為了避免 deepCopy 把所有節(jié)點(diǎn)否復(fù)制一遍帶來的性能問題糯累, immutable 使用了 Structural Sharing(結(jié)構(gòu)共享),即如果對(duì)象樹中的一個(gè)節(jié)點(diǎn)改變册踩,只修改這個(gè)節(jié)點(diǎn)和受它影響的父節(jié)點(diǎn)泳姐,其他節(jié)點(diǎn)共享。
  • immutable-js 使用了另一套數(shù)據(jù)結(jié)構(gòu) api暂吉,它會(huì)將原生數(shù)據(jù)類型都轉(zhuǎn)化為 immutable-js 內(nèi)部對(duì)象胖秒。

內(nèi)部實(shí)現(xiàn)了一套 Persistent Data Structure缎患,還有很多易用的數(shù)據(jù)類型像 CollectionList阎肝、Map挤渔、SetRecord风题、Seq判导。有非常全面的mapfilter沛硅、groupBy眼刃、reduce``find函數(shù)式操作方法。同時(shí) API 也盡量與 Object 或 Array 類似摇肌。

缺點(diǎn):

  1. 需要學(xué)習(xí)新的 API
  2. 容易與原生對(duì)象混淆擂红。
    Immutable 中的 Map 和 List 雖對(duì)應(yīng)原生 Object 和 Array,但操作非常不同朦蕴,比如你要用 map.get('key') 而不是 map.key篮条,array.get(0) 而不是 array[0]弟头。另外 Immutable 每次修改都會(huì)返回新對(duì)象吩抓,也很容易忘記賦值。

和 redux 的配合使用赴恨,redux 簡化了 Flux 中多個(gè) store 的概念疹娶,只有一個(gè) store,數(shù)據(jù)操作通過 reducer 使用伦连。reducer 就是要接受一個(gè)純函數(shù)雨饺。

const reducer = function (state, action) {
  // ...
  return new_state;
};

immer

mobx 作者寫的一個(gè) immutable 庫,核心實(shí)現(xiàn)利用 es6 的 proxy惑淳。
immer 使用原生數(shù)據(jù)結(jié)構(gòu)的 api额港,而不像 immutable-js 轉(zhuǎn)化為內(nèi)置對(duì)象的 api。
學(xué)習(xí)成本低歧焦,就是把之前的操作放置到 produce 函數(shù)的第二參數(shù)函數(shù)中去執(zhí)行移斩。
原理:使用了一個(gè) ES6 的新特性 Proxy 對(duì)象。深層嵌套對(duì)象的結(jié)構(gòu)化共享的處理

proxy 具體可以看 Proxy

var proxy = new Proxy(target, handler);
  • target 參數(shù)表示所要攔截的目標(biāo)對(duì)象绢馍。如果沒有 Proxy 的介入向瓷,操作原來要訪問的就是這個(gè)對(duì)象
  • handler 參數(shù)也是一個(gè)對(duì)象,用來定制攔截行為舰涌。對(duì)于每一個(gè)被代理的操作猖任,需要提供一個(gè)對(duì)應(yīng)的處理函數(shù),該函數(shù)將攔截對(duì)應(yīng)的操作

Proxy 無法 polyfill瓷耙,所以 immer 在不支持 Proxy 的環(huán)境中朱躺,使用 Object.defineProperty 來進(jìn)行一個(gè)兼容刁赖。

immer 維護(hù)一份 state 在內(nèi)部,劫持所有操作长搀,內(nèi)部來判斷是否有變化從而最終決定如何返回乾闰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盈滴,隨后出現(xiàn)的幾起案子涯肩,更是在濱河造成了極大的恐慌,老刑警劉巖巢钓,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病苗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡症汹,警方通過查閱死者的電腦和手機(jī)硫朦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背镇,“玉大人咬展,你說我怎么就攤上這事÷髡叮” “怎么了破婆?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胸囱。 經(jīng)常有香客問我祷舀,道長,這世上最難降的妖魔是什么烹笔? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任裳扯,我火速辦了婚禮,結(jié)果婚禮上谤职,老公的妹妹穿的比我還像新娘饰豺。我一直安慰自己,他們只是感情好允蜈,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布冤吨。 她就那樣靜靜地躺著,像睡著了一般陷寝。 火紅的嫁衣襯著肌膚如雪锅很。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天凤跑,我揣著相機(jī)與錄音爆安,去河邊找鬼。 笑死仔引,一個(gè)胖子當(dāng)著我的面吹牛扔仓,可吹牛的內(nèi)容都是我干的褐奥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼翘簇,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼撬码!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起版保,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤呜笑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后彻犁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叫胁,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年汞幢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驼鹅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡森篷,死狀恐怖输钩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仲智,我是刑警寧澤买乃,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站坎藐,受9級(jí)特大地震影響为牍,放射性物質(zhì)發(fā)生泄漏哼绑。R本人自食惡果不足惜岩馍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抖韩。 院中可真熱鬧蛀恩,春花似錦、人聲如沸茂浮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽席揽。三九已至顽馋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幌羞,已是汗流浹背寸谜。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留属桦,地道東北人熊痴。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓他爸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親果善。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诊笤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 原文 我們知道 js 對(duì)象是按共享傳遞(call by sharing)的,因此在處理復(fù)雜 js 對(duì)象的時(shí)候馆类,往往...
    videring閱讀 1,043評(píng)論 0 2
  • 本篇只是對(duì)Immutable.js的簡單介紹乾巧,后續(xù)會(huì)繼續(xù)分享其具體實(shí)踐應(yīng)用句喜。 什么是Immutable Data?...
    桂圓_noble閱讀 48,201評(píng)論 4 67
  • js 對(duì)象深拷貝 JS 里面的變量類型可以分為 基本類型 和 引用類型 沟于。在使用過程中咳胃,引用類型經(jīng)常會(huì)產(chǎn)生一些無法...
    車與路閱讀 1,214評(píng)論 2 4
  • React在減少重復(fù)渲染方面確實(shí)是有一套獨(dú)特的處理辦法,那就是虛擬DOM旷太,但顯然在首次渲染的時(shí)候React絕無可能...
    Nosaj閱讀 575評(píng)論 0 2
  • 前言 React和Redux都遵守組件狀態(tài)為不可變(immutable)的理念展懈,通常在修改state的時(shí)候都會(huì)使用...
    _stan閱讀 4,577評(píng)論 0 3