摘要:在中,的返回值是,即一個新的對象。該方法在中的和中均有使用,但是此處的方法返回的是一個布爾值。是排序方法,可以傳入一個函數(shù),通過返回值的正負確定元素的前后排序順序。
1.immutableObj在復制的時候,復制的是引用。
=== 比較的是引用是否一樣。
而is()和equal()表示的是值是否一樣,什么是值,我認為就是將一個對象Json.stringify()之后的的數(shù)據(jù)。
總體而言,如果===相等,那么使用equal()和is()也是相等的;
如果只是is和equal()相等,可能===相等,也可能是兩個對象被json.stringify()之后的字符串是相等的。
如果是像map1 = map3的賦值操作,其實這里復制的是引用。
就上面的結(jié)論可知,只要引用向相同, === 和 equals() 返回的都是true.
2.immutable中的對象的使用和es2015灰常的像,一個最大的區(qū)別,就是不管啥時候,返回值都是一個新的immutable集合。
比如arr=[1,2] ,arr.push(3,4)的返回值是4,即arr的新長度。
在immutable中,arr1=List([1,2]) , arr1.push(3,4)的返回值是List([1,2,3,4]),即一個新的immutable對象。
3.immutable對象和es2015中原生的對象是可以自由合并的。啥意思?就是當obj被immutable的Map對象merge,
或者是array被immutable的List來concat的時候,es2015中的array和object就被自動對應轉(zhuǎn)換成了List和Map.
說白了,就是當Array或者Object被傳入immutable的List和Map使用的方法的時候,會做一個類型檢測,如果接受的參數(shù)是
Array,就將該Array轉(zhuǎn)換成List,如果參數(shù)是Object, 就將該Object轉(zhuǎn)換成Immutable的Map.
換一個角度看,這可以讓我們更靈活的合并處理es2015的原生對象和immutable對象。即擴展了es2015原生對象的方法集。
注意:使用immutable對象的api將es2015原生對象Object轉(zhuǎn)換成immutable中的map的時候,這個Object的所有key值都會被作為字符串處理。
如果Object使用的是[變量]的方式設置的key值,當使用immutable的map的api將其轉(zhuǎn)換成map的時候,這個key值就是[變量]中的
"變量"指代的字符串。
但如果變量指代的不是字符串,而是對象呢? ==> 當然是把這個對象stringy成一個字符串啊
4.immutable對象怎樣轉(zhuǎn)換成es2015的原生對象呢?
這里的轉(zhuǎn)換有三種: 對應淺拷貝的淺轉(zhuǎn)換;toObject() / toArray()
對應深拷貝的深轉(zhuǎn)換; toJS() , toJSON()
直接轉(zhuǎn)換成字符串; JSON.stringify(immutableObj)
注意: 這里的toObject() / toArray / toJS() / toJSON都是map和list通用的。
5.所有的immutable的對象都是iterable對象,這可就意味著它可以被yield,可以被for of, 也可以被...符號所展開。
6.操作嵌套immutable數(shù)據(jù)結(jié)構(gòu)的有效方式就是使用專門操作嵌套數(shù)據(jù)的api.
比如mergeDeep(),getIn(),setIn(),updateIn(). 這4個方法被使用在List,Map和OrderedMap對象上。
getIn()/setIn()/updateIn()傳遞的第一個參數(shù)是key值組成的路徑。
而mergeDeep()傳遞的參數(shù)是一個嵌套Obj.
7.當map在使用自己的api來update自己的時候,如果update的結(jié)果和自己原本是一模一樣的,
那么該update的api返回的對象的引用和自己是一樣的。
當update之后的結(jié)果和自己不同,那么update返回的對象會被在內(nèi)存中新建一個引用。
es2015中原生的map如果使用set()更新了自己的數(shù)據(jù),不管更新之后,數(shù)據(jù)有沒有變化,
set()方法返回的引用都是一樣的。
8.如果想要多次更改某個immutable對象,但是卻只需要生成一個新的immutable對象,
可以使用withMutations()方法。在這個方法中,只能夠使用set,push,pop,clear,unshift,shift ,
update, setIn , updateIn , mergeIn,mergeDeepIn() , concat()方法。
9.seq是一種可以使用鏈式書寫的對象。它在使用鏈式書寫的時候,只會產(chǎn)生一個新對象,鏈式中間的操作是不會產(chǎn)生新的對象的。
其他的常用對象,比如Map和List可以通過Seq()轉(zhuǎn)換成一個seq對象。但是事實上,這種對象有什么樣的具體作用還尚不清楚。
下面挑選了List對象來進行深度分析,下面是一些API的記錄:
/**
List對象可以由3種方式轉(zhuǎn)換而成。
(1) es2105中的Array;
(2) es2015中的set
(3) immutable中的set
(4) es2015中的Array或者set的遍歷器接口 : someArray[Symbol.iterator]()
*
可以通過List.of()方法構(gòu)造List.這個和es2015的Array.of()是一樣的。
*
更新List中的值使用的是set()方法,這個和es2015中的Array和set都不同,和es2015的map設置值的方式是一樣的。
這里的set()方法的第一個參數(shù)是索引,該索引可以是負數(shù),用法和Array中使用slice()方法參數(shù)為負數(shù)是一樣的。
*
刪除List中的數(shù)據(jù),使用的是delete()方法。該方法在es2015中的set和map中均有使用,但是此處的delete()方法返回的是
一個布爾值。而List中使用的delete()方法更像Array中的splice(index,1),只不過,delete()的返回值是一個新的List,
而splice()返回的是被刪除的項目。
*
向List中增加數(shù)據(jù),使用的是insert()方法,和Array中的splice(index, 0 , value)一樣。返回的是一個新的List()對象。
*
對List的首尾增減使用的是和es2015中的Array一樣的方式,只不過這4個api返回的都是一個新的List對象。
push(), pop(), shift(), unshift()
*
如果想要更新List中某一個已有項目的value,使用的是update()方法。這個方法接受2個參數(shù),第一個參數(shù)是索引,第二個參數(shù)
是一個函數(shù),這個函數(shù)接受之前在該索引位置的值作為參數(shù),返回一個新value,可以是任意類型。注意,update()是更新已有的值,
set()是設置某個位置上的值,如果那個位置上已經(jīng)有值,使用set()設置之后,該位置上的值會被替換。
*
如果想要向Array設置length一樣,粗暴地重置一個List的長度,使用的方法是setSize()方法。二者效果是一致的。
setSize()返回一個新長度的List()對象。
*
如果想要深度設置List內(nèi)部嵌套的數(shù)據(jù),使用setIn()方法,第一個參數(shù)是索引組成的路徑。第二個參數(shù)是新設置的值。
話說這個嵌套是個什么嵌套法?
當嵌套的是Array或者是List的時候,path中都是索引;當嵌套的是Object或者是Map的時候,path是索引和key組合的。
*
如果想更新嵌套List,使用的api是updateIn(),該參數(shù)接受兩個參數(shù),一個是索引組成的path,第二個依舊是一個函數(shù),接受
該位置老數(shù)據(jù)作為參數(shù)。
*
類似于Array中的其他方法,比如concat(),map(),filter()方法的使用都和Array是一樣的,只不過這幾個方法返回的都是新的
List對象。然后在map()和filter()方法中的item都是一個Immutable對象。
*
另,List中的還有filterNot()方法,其實就是對filter()方法取反。其他的使用方法一樣,也是返回一個布爾值。
*
另,List中還有reverse()和sort()方法,reverse()方法和Array中的reverse()方法是一樣的,都是用來將索引翻轉(zhuǎn)。
sort()是排序方法,可以傳入一個函數(shù),通過返回值的正負確定元素的前后排序順序。
*
如果是一個簡單map調(diào)用sort()進行排序,sort((a,b)=>{})中的a和b是map中的第一層value.
如果是一個復雜的map想要使用sort來排序,可能由于value的數(shù)據(jù)類型不同,sort()函數(shù)根本就無法比較。
此時需要使用sortBy()函數(shù),該函數(shù)接受兩個參數(shù),第一個參數(shù)用來指定要比較的是每一個map項目中的某個部分,
第二個參數(shù)和sort()函數(shù)接受的回調(diào)是一樣的,即比較那一項,根據(jù)返回值的正負確定排序。
*
*
如果想要將一個List轉(zhuǎn)換成Array,有淺轉(zhuǎn)換和深轉(zhuǎn)換。
someList.toJS() : 遞歸轉(zhuǎn)換List成es2015中的array,將List中的所有項目轉(zhuǎn)換成Array和object;
*
someList.toJSON() 和 someList.toArray() 都是將一個List淺轉(zhuǎn)換成array,也就是說,將這個List轉(zhuǎn)換成Array,這
個array中的items的類型是不會被轉(zhuǎn)換的。之前的List中的第一層數(shù)據(jù)如果有List和Map,那么淺轉(zhuǎn)換之后的Array的
第一層item還是List和Map.
*
someList.toObject()可以將List轉(zhuǎn)換成key是string的Object.
*
*
上面的方法都是講怎么操作整個List的。下面的有幾個方法講怎么獲取List中的item.或者給item賦值的。
get(index)獲取某個索引位置的value;
has(index) 判斷某個索引是不是存在的。比如一個List的size是6,那么has(7)肯定返回false.
includes(value) 判斷List中存在某個value.這個參數(shù)value如果和List中的某個value是值等的,就返回true.
*
*
另,在Array中還有splice()方法啊,indexof(), lastIndexOf(), List中也有這些方法,使用效果都是一樣的。
*
**/
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101840.html
摘要:為了盡可能提升互通性,已經(jīng)成為函數(shù)式編程庫遵循的實際標準。與輕量級函數(shù)式編程的概念相反,它以火力全開的姿態(tài)進軍的函數(shù)式編程世界。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),...
摘要:的優(yōu)勢保證不可變每次通過操作的對象都會返回一個新的對象豐富的性能好通過字典樹對數(shù)據(jù)結(jié)構(gòu)的共享的問題與原生交互不友好通過生成的對象在操作上與原生不同,如訪問屬性,。 Immutable.js Immutable的優(yōu)勢 1. 保證不可變(每次通過Immutable.js操作的對象都會返回一個新的對象) 2. 豐富的API 3. 性能好 (通過字典樹對數(shù)據(jù)結(jié)構(gòu)的共享) Immutab...
摘要:基于全家桶寫作新聞一體綜合應用的實踐總結(jié)在線地址大家伙兒們,又見面了。參照但不可否認非常符合的思想,都在處理大規(guī)模數(shù)據(jù)時彰顯優(yōu)勢。最好的辦法是使用部署環(huán)境。細致的拆分,解耦性更好,以為單位進行修改時,大大降低誤傷率的同時,隔離無關的信息。 ?CoderPad-基于React全家桶寫作/新聞一體綜合應用的實踐總結(jié) showImg(https://segmentfault.com/img/...
摘要:與持久化工程師花了年時間打造,與同期出現(xiàn)。有持久化數(shù)據(jù)結(jié)構(gòu),如等,并發(fā)安全。總結(jié)篇幅有限,時間也比較晚了,關于前端數(shù)據(jù)的扁平化與持久化處理先講這么多了,有興趣的同學可以關注下,后面有時間會多整理分享。 (PS: 時間就像海綿里的水,擠到?jīng)]法擠,只能擠擠睡眠時間了~ 知識點還是需要整理的,付出總會有收獲,tired but fulfilled~) 前言 最近業(yè)務開發(fā),從零搭建網(wǎng)頁生成器,...
閱讀 3615·2021-09-08 10:46
閱讀 1237·2019-08-30 13:17
閱讀 2426·2019-08-30 13:05
閱讀 1253·2019-08-29 15:29
閱讀 2935·2019-08-29 11:31
閱讀 589·2019-08-26 12:13
閱讀 1604·2019-08-26 11:42
閱讀 1974·2019-08-23 18:37