亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript稀疏數(shù)組與孔hole示例詳解

 更新時(shí)間:2022年06月27日 10:01:02   作者:csRyan  
這篇文章主要為大家介紹了JavaScript稀疏數(shù)組與孔hole示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jì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'。如果按照密集數(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)用new Array(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ù)制孔

var arr = [ '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ù))

var arr = [ 'a', , 'b' ]
// ["a", undefined × 1, "b"]
arr.forEach(function (x, i) { console.log(i+'.'+x) })
// 0.a
// 2.b
arr.every(function (x) { return x.length === 1 })
// true

map不對(duì)孔調(diào)用回調(diào)函數(shù),但是孔會(huì)保留

arr.map(function (x,i) { return i+'.'+x })
// [ '0.a', undefined × 1, '2.b' ]

filter不對(duì)孔調(diào)用回調(diào)函數(shù),但是孔會(huì)被過(guò)濾掉

arr.filter(function (x) { return true })
// [ '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è)“空位”一樣:

var arr2 = 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ò)new Array(3)與map方法得到:

var a1 = new Array(3)
// [undefined × 3]
a1.map(function (x, i) { return i })
// [undefined × 3]
// 因?yàn)閙ap會(huì)跳過(guò)孔,所以實(shí)際上回調(diào)函數(shù)沒(méi)有被調(diào)用過(guò)

a1有孔

正確的方法:

var a2 = Array.apply(null, Array(3))
// [undefined, undefined, undefined]
a2.map(function (x, i) { return i })
// [0, 1, 2]
// map的回調(diào)函數(shù)執(zhí)行了3次

a2無(wú)孔

[undefined × 3]和[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))的原理

為什么var a2 = 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://2ality.com/2013/11/initializing-arrays.html

https://2ality.com/2013/07/array-iteration-holes.html

https://2ality.com/2012/06/dense-arrays.html

https://2ality.com/2015/09/holes-arrays-es6.html

以上就是JavaScript稀疏數(shù)組與孔hole示例詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript稀疏數(shù)組與孔hole的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • YUI Compressor壓縮JavaScript原理及微優(yōu)化

    YUI Compressor壓縮JavaScript原理及微優(yōu)化

    最近寫一個(gè)jQuery插件,在最后完成優(yōu)化時(shí),對(duì)比發(fā)現(xiàn)壓縮后文件比較大,就思考那些是可以被修改和優(yōu)化的,發(fā)現(xiàn)壓縮原理也有很大的空間可以學(xué)習(xí)
    2013-01-01
  • 淺談幾種常用的JS類定義方法

    淺談幾種常用的JS類定義方法

    下面小編就為大家?guī)?lái)一篇淺談幾種常用的JS類定義方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • JS動(dòng)態(tài)增加刪除UL節(jié)點(diǎn)LI及相關(guān)內(nèi)容示例

    JS動(dòng)態(tài)增加刪除UL節(jié)點(diǎn)LI及相關(guān)內(nèi)容示例

    這篇文章主要介紹了JS如何動(dòng)態(tài)增加刪除UL節(jié)點(diǎn)LI及相關(guān)內(nèi)容,需要的朋友可以參考下
    2014-05-05
  • bootstrap suggest下拉框使用詳解

    bootstrap suggest下拉框使用詳解

    這篇文章主要為大家詳細(xì)介紹了bootstrap suggest js下拉框的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 利用javascript實(shí)現(xiàn)的三種圖片放大鏡效果實(shí)例(附源碼)

    利用javascript實(shí)現(xiàn)的三種圖片放大鏡效果實(shí)例(附源碼)

    這篇文章主要介紹了利用javascript實(shí)現(xiàn)的幾種放大鏡效果,很實(shí)用一款漂亮的js圖片放大鏡特效,常見(jiàn)于電商網(wǎng)站上產(chǎn)品頁(yè),用來(lái)放大展示圖片細(xì)節(jié),很有實(shí)用性,推薦下載學(xué)習(xí)研究。文中提供了完整的源碼供大家下載,需要的朋友可以參考借鑒,一起來(lái)看看吧。
    2017-01-01
  • GoJs的文本繪圖模板TextBlock使用實(shí)例

    GoJs的文本繪圖模板TextBlock使用實(shí)例

    這篇文章主要為大家介紹了GoJs的文本繪圖模板TextBlock使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Cropper.js進(jìn)階之固定寬高圖片裁切實(shí)現(xiàn)示例

    Cropper.js進(jìn)階之固定寬高圖片裁切實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Cropper.js進(jìn)階之固定寬高圖片裁切實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 最簡(jiǎn)單的JavaScript圖片輪播代碼(兩種方法)

    最簡(jiǎn)單的JavaScript圖片輪播代碼(兩種方法)

    基于javascript代碼實(shí)現(xiàn)最簡(jiǎn)單的圖片輪播效果,非常簡(jiǎn)單,本文通過(guò)兩種方式給大家介紹最簡(jiǎn)單的圖片輪播,感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • AutoJs4.4.1免費(fèi)版快速接通vscode調(diào)試腳本的操作方法

    AutoJs4.4.1免費(fèi)版快速接通vscode調(diào)試腳本的操作方法

    這篇文章主要介紹了AutoJs4.4.1免費(fèi)版快速接通vscode進(jìn)行調(diào)試腳本,首先下載AutoJs并安裝,下載完成后,將2個(gè)apk文件拷貝到手機(jī)安裝即可,接下來(lái)需要安裝插件,本文分步驟給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • js判斷圖片加載完成后獲取圖片實(shí)際寬高的方法

    js判斷圖片加載完成后獲取圖片實(shí)際寬高的方法

    這篇文章主要介紹了js判斷圖片加載完成后獲取圖片實(shí)際寬高的方法,涉及JavaScript圖片加載及屬性操作相關(guān)技巧,需要的朋友可以參考下
    2016-02-02

最新評(píng)論