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