摘要:擴(kuò)展這位老兄的答案中附上了一個(gè)非??褚暗姆椒ㄟ@段代碼可以創(chuàng)建出一個(gè)長(zhǎng)度為的全數(shù)組。創(chuàng)建全數(shù)組測(cè)試看來有時(shí)候優(yōu)雅的方法不一定是最好的啊
問題
乍看之下,創(chuàng)建全0數(shù)組應(yīng)該是一件不能再簡(jiǎn)單的事情了:
var arr = [0,0,0,0,0,0];
然而有時(shí)候需要?jiǎng)?chuàng)建出長(zhǎng)度比較長(zhǎng)的全0數(shù)組(比如做桶排序時(shí)就需要),這種字面聲明可能就不太適合,因?yàn)椴豢赡苁执虺鰩兹f個(gè)0。所以今天創(chuàng)建全0數(shù)組的時(shí)候,我用了以下方法:
var arr = new Array(10); //這里等同于 //var arr = [];arr.length = 10; arr = arr.map(function(value,index,array){ return value = 0; });
然后對(duì)于arr里的元素都進(jìn)行了++處理:
arr[i]++;
最后console.log(arr)的時(shí)候卻發(fā)現(xiàn),結(jié)果是:
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
當(dāng)時(shí)還以為自己map函數(shù)寫錯(cuò)了,于是想了一個(gè)方法來驗(yàn)證:
var arr = [1,2,3,4,5,6,7,8,9,10]; arr = arr.map(function(value,index,array){ return value = 0; }); console.log(arr);
結(jié)果得到了[0,0,0,0,0,0,0,0,0,0];
也就是說,使用new方法聲明的數(shù)組,沒法用map方法初始化每一個(gè)值
解決就著這個(gè)問題去網(wǎng)上搜索答案,結(jié)果在Stackoverflow - Most efficient way to create a zero filled JavaScript array?中找到了一些參考。在友人zertosh的答案的評(píng)論中,他解釋了:
擴(kuò)展當(dāng)你用new關(guān)鍵字加上某個(gè)長(zhǎng)度來創(chuàng)建數(shù)組的時(shí)候,你創(chuàng)建的是類似于{ length: 5, __proto__: Array.prototype }的東西,而不是{0:0, 1:0, 2:0, 3:0 length: 3, __proto__: Array.prototype }的一般數(shù)組的樣子,也就是說里面徒有數(shù)組長(zhǎng)度,卻一個(gè)數(shù)組元素都沒有。這樣在調(diào)用map等函數(shù)的時(shí)候,由于數(shù)組里沒有一個(gè)元素,所以也就不能對(duì)數(shù)組的元素進(jìn)行操作。
這位老兄的答案中附上了一個(gè)非??褚暗姆椒ǎ?/p>
Array.apply(null, Array(5)).map(Number.prototype.valueOf,0);
這段代碼可以創(chuàng)建出一個(gè)長(zhǎng)度為5的全0數(shù)組。因?yàn)榕d趣所以我搜索了其他創(chuàng)建全0數(shù)組的代碼放在下面:
new Array(5+1).join("0").split("")
var ary = new Uint8Array(10);
//ES6添加的fill方法 var arr = new Array(10); arr.fill(0);
當(dāng)然少不了最簡(jiǎn)單粗暴的:
var arr = [];for(var n = 0; n < 100; n++) arr[n] = 0
有網(wǎng)友測(cè)試了上述方法的性能,結(jié)果發(fā)現(xiàn)原來簡(jiǎn)單粗暴的arr[n] = 0的性能是最好的,哪怕你用arr.push(0)都弱爆了。創(chuàng)建全0數(shù)組測(cè)試 - jsperf.com
看來有時(shí)候優(yōu)(zhuang)雅(bi)的方法不一定是最好的啊
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/86067.html
摘要:是什么存在于全局對(duì)象上,無需引入模塊即可使用,可見重要性非同一般。可以理解是在內(nèi)存中開辟的一片區(qū)域,用于存放二進(jìn)制數(shù)據(jù)。大小通過參數(shù)指定,默認(rèn)情況下是。一般情況下位系統(tǒng)大約是,位系統(tǒng)大約是。 Buffer是什么? Buffer存在于全局對(duì)象上,無需引入模塊即可使用,可見重要性非同一般。可以理解Buffer是在內(nèi)存中開辟的一片區(qū)域,用于存放二進(jìn)制數(shù)據(jù)。Buffer所開辟的是堆外內(nèi)存。 B...
摘要:如果數(shù)組已經(jīng)為空,則不改變數(shù)組,并返回值。中所有在數(shù)組被修改時(shí)都遵從這個(gè)原則,以下不再重復(fù)方法會(huì)給原數(shù)組中的每個(gè)元素都按順序調(diào)用一次函數(shù)。每次執(zhí)行后的返回值沒有指定返回值則返回組合起來 數(shù)組應(yīng)該是我們?cè)趯懗绦蛑袘?yīng)用到最多的數(shù)據(jù)結(jié)構(gòu)了,相比于無序的對(duì)象,有序的數(shù)組幫我們?cè)谔幚頂?shù)據(jù)時(shí),實(shí)在是幫了太多的忙了。今天剛好看到一篇Array.include的文章,忽然發(fā)現(xiàn)經(jīng)過幾個(gè)ES3,ES5,E...
摘要:方法將所有在過濾函數(shù)中返回的數(shù)組元素放進(jìn)一個(gè)新數(shù)組中并返回。方法從左到右為每個(gè)數(shù)組元素執(zhí)行一次回調(diào)函數(shù),并把上次回調(diào)函數(shù)的返回值放在一個(gè)暫存器中傳給下次回調(diào)函數(shù),并返回最后一次回調(diào)函數(shù)的返回值。 創(chuàng)建數(shù)組 var array = new Array(); var array = new Array(10); var array = new Array(red,blue,green);...
摘要:數(shù)組方法全解析包含數(shù)組自帶屬性返回創(chuàng)建數(shù)組對(duì)象的原型函數(shù)返回?cái)?shù)組對(duì)象的長(zhǎng)度這個(gè)是老熟人了,可以增加數(shù)組的原型方法和屬性,這個(gè)放在后面的繼承中講數(shù)組的方法首先讓我們看看數(shù)組的對(duì)象屬性。 Javascript 數(shù)組方法全解析(包含es6) 1. 數(shù)組自帶屬性 constructor //返回創(chuàng)建數(shù)組對(duì)象的原型函數(shù) length //返回?cái)?shù)組對(duì)象的長(zhǎng)度 prototype //這個(gè)是老...
摘要:關(guān)于我的博客掘金專欄路易斯專欄原文鏈接深度長(zhǎng)文數(shù)組全解密全文共字,系統(tǒng)講解了數(shù)組的各種特性和。構(gòu)造器構(gòu)造器用于創(chuàng)建一個(gè)新的數(shù)組。中聲明的數(shù)組,它的構(gòu)造函數(shù)是中的對(duì)象。 本文首發(fā)于CSDN網(wǎng)站,下面的版本又經(jīng)過進(jìn)一步的修訂。 關(guān)于 我的博客:louis blog 掘金專欄:路易斯專欄 原文鏈接:【深度長(zhǎng)文】JavaScript數(shù)組全解密 全文共13k+字,系統(tǒng)講解了JavaScrip...
閱讀 3204·2023-04-26 01:39
閱讀 3356·2023-04-25 18:09
閱讀 1625·2021-10-08 10:05
閱讀 3241·2021-09-22 15:45
閱讀 2791·2019-08-30 15:55
閱讀 2402·2019-08-30 15:54
閱讀 3174·2019-08-30 15:53
閱讀 1336·2019-08-29 12:32