




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第JavaScript稀疏數(shù)組與孔hole示例詳解目錄稀疏數(shù)組是什么JavaScript數(shù)組天生就是稀疏數(shù)組JavaScript數(shù)組稀疏特性帶來(lái)的怪異現(xiàn)象slice會(huì)復(fù)制孔forEach、every會(huì)跳過(guò)孔(不對(duì)孔調(diào)用回調(diào)函數(shù))map不對(duì)孔調(diào)用回調(diào)函數(shù),但是孔會(huì)保留filter不對(duì)孔調(diào)用回調(diào)函數(shù),但是孔會(huì)被過(guò)濾掉join會(huì)將孔轉(zhuǎn)化為一個(gè)空字符串進(jìn)行拼接,與undefined一樣初始化無(wú)孔數(shù)組的方法Array.apply(null,Array(n))的原理
稀疏數(shù)組是什么
在絕大多數(shù)JavaScript的實(shí)現(xiàn)中,數(shù)組是稀疏的,我們可以認(rèn)為js的數(shù)組都是稀疏的(雖然ES標(biāo)準(zhǔn)并沒(méi)有這樣規(guī)定)。
稀疏數(shù)組與密集數(shù)組最大的不同,就是稀疏數(shù)組中可以有孔(hole)。孔是邏輯上存在于數(shù)組中,但物理上不存在與內(nèi)存中的那些數(shù)組項(xiàng)。在那些僅有少部分項(xiàng)被使用的數(shù)組中,孔可以大大減少內(nèi)存空間的浪費(fèi)。比如,我們要表示一個(gè)長(zhǎng)度為10000的數(shù)組,它的最后一個(gè)項(xiàng)是字符串a(chǎn)。如果按照密集數(shù)組的做法,我們需要開(kāi)辟10000個(gè)項(xiàng)的空間,有9999個(gè)項(xiàng)的空間都被浪費(fèi)了。而如果按照稀疏數(shù)組的做法,稀疏數(shù)組只需要記錄:數(shù)組第10000個(gè)項(xiàng)的值為a,這節(jié)省了很多內(nèi)存空間。
JavaScript數(shù)組天生就是稀疏數(shù)組
js數(shù)組就是若干個(gè)下標(biāo)(數(shù)字)與值之間的映射。從下標(biāo)x到值y的映射表示:數(shù)組第x個(gè)項(xiàng)的值為y。這實(shí)際上就是上例中稀疏數(shù)組的記錄方法。
在Chrome控制臺(tái)的執(zhí)行結(jié)果
如上圖,如果你調(diào)用newArray(3),你得到的數(shù)組中只有一個(gè)屬性length,記錄了它的長(zhǎng)度,但是沒(méi)有任何下標(biāo)(數(shù)字)與值之間的映射。這是一個(gè)只有3個(gè)孔的數(shù)組。
如上圖,如果你繼續(xù)執(zhí)行a[1]=aaa,那么實(shí)際上是在這個(gè)稀疏數(shù)組中增加了一條從1到aaa之間的映射。
如上圖,如果你繼續(xù)執(zhí)行a[10000]=bbb,也只不過(guò)是又增加了一條從10000到bbb之間的映射而已。length自動(dòng)變?yōu)榱?0001,這符合我們的直覺(jué)。不存在映射關(guān)系,但又處在數(shù)組長(zhǎng)度范圍內(nèi)的數(shù)組項(xiàng),就是孔。此時(shí),這個(gè)數(shù)組與長(zhǎng)度為2的普通數(shù)組[aaa,bbb],占用相同大小的內(nèi)存空間。
JavaScript數(shù)組稀疏特性帶來(lái)的怪異現(xiàn)象
slice會(huì)復(fù)制孔
vararr=['a',,'b']
//["a",undefined×1,"b"]
arr.slice(1,2)
//[undefined×1]
arr.slice()
//["a",undefined×1,"b"]
forEach、every會(huì)跳過(guò)孔(不對(duì)孔調(diào)用回調(diào)函數(shù))
vararr=['a',,'b']
//["a",undefined×1,"b"]
arr.forEach(function(x,i){console.log(i+'.'+x)})
//0.a
//2.b
arr.every(function(x){returnx.length===1})
//true
map不對(duì)孔調(diào)用回調(diào)函數(shù),但是孔會(huì)保留
arr.map(function(x,i){returni+'.'+x})
//['0.a',undefined×1,'2.b']
filter不對(duì)孔調(diào)用回調(diào)函數(shù),但是孔會(huì)被過(guò)濾掉
arr.filter(function(x){returntrue})
//['a','b']
join會(huì)將孔轉(zhuǎn)化為一個(gè)空字符串進(jìn)行拼接,與undefined一樣
arr.join('-')
//'a--b'
['a',undefined,'b'].join('-')
//'a--b'
而其他所有的數(shù)組方法會(huì)正常對(duì)待孔,就像數(shù)組中真的存在這個(gè)空位一樣:
vararr2=arr.slice()
arr2.sort()
//['a','b',undefined×1]
初始化無(wú)孔數(shù)組的方法
因?yàn)閿?shù)組中的孔會(huì)造成上述的那些怪異現(xiàn)象,所以我們有時(shí)希望初始化一個(gè)沒(méi)有孔的數(shù)組。
比如我們希望初始化[0,1,2]這樣的數(shù)組,但是我們無(wú)法通過(guò)newArray(3)與map方法得到:
vara1=newArray(3)
//[undefined×3]
a1.map(function(x,i){returni})
//[undefined×3]
//因?yàn)閙ap會(huì)跳過(guò)孔,所以實(shí)際上回調(diào)函數(shù)沒(méi)有被調(diào)用過(guò)
a1有孔
正確的方法:
vara2=Array.apply(null,Array(3))
//[undefined,undefined,undefined]
a2.map(function(x,i){returni})
//[0,1,2]
//map的回調(diào)函數(shù)執(zhí)行了3次
a2無(wú)孔
[undefined3]和[undefined,undefined,undefined],chrome控制臺(tái)用這兩種表示方式來(lái)區(qū)分孔和真正的undefined值!
從上面兩幅圖的對(duì)比可以看出,第一種方法沒(méi)有構(gòu)造出映射,只創(chuàng)造出了3個(gè)孔。而第二種方法創(chuàng)建出了真正的從下標(biāo)到值之間的映射,映射的值為undefined。因此map不會(huì)跳過(guò)這些數(shù)組項(xiàng)。
Array.apply(null,Array(n))的原理
為什么vara2=Array.apply(null,Array(3))能創(chuàng)造出無(wú)孔的數(shù)組呢?
我們將一個(gè)含有3個(gè)孔的數(shù)組作為第二個(gè)參數(shù)傳遞給apply,apply將利用這個(gè)數(shù)組來(lái)決定調(diào)用Array()的參數(shù)。
因?yàn)閍pply將數(shù)組中的孔視為undefined,所以Array調(diào)用的參數(shù)實(shí)際上為Array(undefined,undefined,undefined)。
又因?yàn)橥ㄟ^(guò)Array(a,b,c)這種方法調(diào)用Array會(huì)返回[a,b,c],所以Array(undefined,undefined,undefined)返回的是[undefined,undefined,undefined]。
參考資料
https://2/2013/11/initializing-arrays.html
https://2/2013/07/array-iteration-holes.html
https
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度江蘇省二級(jí)注冊(cè)建筑師之法律法規(guī)經(jīng)濟(jì)與施工押題練習(xí)試題B卷含答案
- 工貿(mào)家電面試題及答案
- 光電就業(yè)面試題及答案
- 急診醫(yī)療面試題及答案
- 工商注冊(cè)面試題及答案
- 鬼才邏輯面試題及答案
- 復(fù)雜招聘面試題及答案
- 交通領(lǐng)域新質(zhì)生產(chǎn)力
- T/CADBM 54-2021建筑室內(nèi)窗飾產(chǎn)品蜂巢簾
- 大型軸承采購(gòu)技術(shù)協(xié)議書(shū)
- 酒駕延緩處罰申請(qǐng)書(shū)
- 2023年國(guó)家開(kāi)放大學(xué)《財(cái)務(wù)報(bào)表分析》形成性考核(1-4)試題答案解析
- 2022年1月福建化學(xué)會(huì)考試卷
- 2023年貴州省遵義市中考地理試卷真題(含答案)
- 幼兒園故事課件:《小馬過(guò)河》
- 物料提升機(jī)基礎(chǔ)專(zhuān)項(xiàng)施工方案正文
- 工程機(jī)械管理制度
- 廣東省勞動(dòng)合同電子版(六篇)
- 對(duì)話(huà)大國(guó)工匠-致敬勞動(dòng)模范期末考試答案
- 中央空調(diào)多聯(lián)機(jī)安裝規(guī)范
- 2023年安全制度-城市客運(yùn)企業(yè)主要負(fù)責(zé)人和安全生產(chǎn)管理人員安全考核基礎(chǔ)題庫(kù)(城市軌道交通)考試歷年真題(精準(zhǔn)考點(diǎn))帶答案
評(píng)論
0/150
提交評(píng)論