文檔:https://juejin.cn/post/6844904111402385422
1、immutable解決了什么問(wèn)題?
數(shù)據(jù)分為基本類型和引用類型,多出引用同一處數(shù)據(jù)源,并加以修改,就會(huì)出現(xiàn)不可預(yù)測(cè)的問(wèn)題。
那就再每次修改數(shù)據(jù)源的時(shí)候,深拷貝一份數(shù)據(jù)源,在拷貝的數(shù)據(jù)上做操作? 浪費(fèi)內(nèi)存,消耗性能。
所以在 2014 年,facebook 的 immutable-js 橫空出世,即保證了數(shù)據(jù)間的 immutable ,在運(yùn)行時(shí)判斷數(shù)據(jù)間的引用情況,又兼顧了性能。
Immutable 實(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ù)制一遍帶來(lái)的性能損耗,Immutable 使用了 Structural Sharing(結(jié)構(gòu)共享),即如果對(duì)象樹中一個(gè)節(jié)點(diǎn)發(fā)生變化,只修改這個(gè)節(jié)點(diǎn)和受它影響的父節(jié)點(diǎn),其它節(jié)點(diǎn)則進(jìn)行共享。
immer與 immutable-js 最大的不同,immer 是使用原生數(shù)據(jù)結(jié)構(gòu)的 API 而不是像 immutable-js 那樣轉(zhuǎn)化為內(nèi)置對(duì)象之后使用內(nèi)置的 API。所有具有副作用的邏輯都可以放進(jìn) produce 的第二個(gè)參數(shù)的函數(shù)內(nèi)部進(jìn)行處理。在這個(gè)函數(shù)內(nèi)部對(duì)原來(lái)的數(shù)據(jù)進(jìn)行任何操作,都不會(huì)對(duì)原對(duì)象產(chǎn)生任何影響
-immersed原理:Immer 源碼中,使用了一個(gè) ES6 的新特性 Proxy 對(duì)象。