最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript稀疏數組與孔hole示例詳解

 更新時間:2022年06月27日 10:01:02   作者:csRyan  
這篇文章主要為大家介紹了JavaScript稀疏數組與孔hole示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

稀疏數組是什么

在絕大多數JavaScript的實現(xiàn)中,數組是稀疏的,我們可以認為js的數組都是稀疏的(雖然ES標準并沒有這樣規(guī)定)。

稀疏數組與密集數組最大的不同,就是稀疏數組中可以有“孔”(hole)??资沁壿嬌洗嬖谟跀到M中,但物理上不存在與內存中的那些數組項。在那些僅有少部分項被使用的數組中,孔可以大大減少內存空間的浪費。比如,我們要表示一個長度為10000的數組,它的最后一個項是字符串'a'。如果按照密集數組的做法,我們需要開辟10000個項的空間,有9999個項的空間都被浪費了。而如果按照稀疏數組的做法,稀疏數組只需要記錄:“數組第10000個項的值為'a'”,這節(jié)省了很多內存空間。

JavaScript數組天生就是稀疏數組

js數組就是若干個下標(數字)與值之間的映射。從下標x到值y的映射表示:“數組第x個項的值為y”。這實際上就是上例中稀疏數組的記錄方法。

在Chrome控制臺的執(zhí)行結果


如上圖,如果你調用new Array(3),你得到的數組中只有一個屬性length,記錄了它的長度,但是沒有任何下標(數字)與值之間的映射。這是一個只有3個孔的數組。

如上圖,如果你繼續(xù)執(zhí)行a[1] = 'aaa',那么實際上是在這個稀疏數組中增加了一條從1到"aaa"之間的映射。

如上圖,如果你繼續(xù)執(zhí)行a[10000]='bbb',也只不過是又增加了一條從10000到"bbb"之間的映射而已。length自動變?yōu)榱?0001,這符合我們的直覺。不存在映射關系,但又處在數組長度范圍內的數組項,就是孔。此時,這個數組與長度為2的普通數組['aaa', 'bbb'],占用相同大小的內存空間。

JavaScript數組稀疏特性帶來的“怪異現(xiàn)象”

slice會復制孔

var arr = [ 'a', , 'b' ]
// ["a", undefined × 1, "b"]
arr.slice(1,2)
// [undefined × 1]
arr.slice()
// ["a", undefined × 1, "b"]

forEach、every會跳過孔(不對孔調用回調函數)

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不對孔調用回調函數,但是孔會保留

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

filter不對孔調用回調函數,但是孔會被過濾掉

arr.filter(function (x) { return true })
// [ 'a', 'b' ]

join會將孔轉化為一個空字符串進行拼接,與undefined一樣

arr.join('-')
// 'a--b'
[ 'a', undefined, 'b' ].join('-')
// 'a--b'

而其他所有的數組方法會正常對待孔,就像數組中真的存在這個“空位”一樣:

var arr2 = arr.slice()
arr2.sort()
// [ 'a', 'b', undefined × 1 ]

初始化無孔數組的方法

因為數組中的孔會造成上述的那些“怪異現(xiàn)象”,所以我們有時希望初始化一個沒有孔的數組。
比如我們希望初始化[0,1,2]這樣的數組,但是我們無法通過new Array(3)與map方法得到:

var a1 = new Array(3)
// [undefined × 3]
a1.map(function (x, i) { return i })
// [undefined × 3]
// 因為map會跳過孔,所以實際上回調函數沒有被調用過

a1有孔

正確的方法:

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

a2無孔

[undefined × 3]和[undefined, undefined, undefined],chrome控制臺用這兩種表示方式來區(qū)分孔和真正的undefined值!

從上面兩幅圖的對比可以看出,第一種方法沒有構造出映射,只創(chuàng)造出了3個孔。而第二種方法創(chuàng)建出了真正的“從下標到值之間的映射”,映射的值為undefined。因此map不會跳過這些數組項。

Array.apply(null, Array(n))的原理

為什么var a2 = Array.apply(null, Array(3))能創(chuàng)造出無孔的數組呢?

我們將一個含有3個孔的數組作為第二個參數傳遞給apply,apply將利用這個數組來決定調用Array()的參數。

因為apply將數組中的孔視為undefined,所以Array調用的參數實際上為Array(undefined, undefined, undefined)。

又因為通過Array(a,b,c)這種方法調用Array會返回[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稀疏數組與孔hole示例詳解的詳細內容,更多關于JavaScript稀疏數組與孔hole的資料請關注腳本之家其它相關文章!

相關文章

最新評論

通渭县| 称多县| 延边| 蕉岭县| 霍城县| 澜沧| 宣武区| 温泉县| 冀州市| 黎城县| 安图县| 乌拉特中旗| 南靖县| 娄底市| 枞阳县| 双城市| 灵武市| 荆门市| 防城港市| 田阳县| 贺州市| 登封市| 丹东市| 苗栗市| 柳江县| 望奎县| 广安市| 雷州市| 翁牛特旗| 博野县| 慈利县| 石柱| 韶山市| 融水| 繁昌县| 遂宁市| 冀州市| 恩施市| 灵石县| 海盐县| 马龙县|