建立全0數組(Zero filled array creation)

問題

乍看之下,建立全0數組應該是一件不能再簡單的事情了:javascript

var arr = [0,0,0,0,0,0];

然而有時候須要建立出長度比較長的全0數組(好比作桶排序時就須要),這種字面聲明可能就不太適合,由於不可能手打出幾萬個0。因此今天建立全0數組的時候,我用瞭如下方法:java

var arr = new Array(10);
//這裏等同於
//var arr = [];arr.length = 10;

arr = arr.map(function(value,index,array){
    return value = 0;
});

而後對於arr裏的元素都進行了++處理:數組

arr[i]++;

最後console.log(arr)的時候卻發現,結果是:app

[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]

當時還覺得本身map函數寫錯了,因而想了一個方法來驗證:jsp

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);

結果獲得了[0,0,0,0,0,0,0,0,0,0];函數

也就是說,使用new方法聲明的數組,無法用map方法初始化每個值性能

解決

就着這個問題去網上搜索答案,結果在Stackoverflow - Most efficient way to create a zero filled JavaScript array?中找到了一些參考。在友人zertosh的答案的評論中,他解釋了:測試

當你用new關鍵字加上某個長度來建立數組的時候,你建立的是相似於{ length: 5, __proto__: Array.prototype }的東西,而不是{0:0, 1:0, 2:0, 3:0 length: 3, __proto__: Array.prototype }的通常數組的樣子,也就是說裏面徒有數組長度,卻一個數組元素都沒有。這樣在調用map等函數的時候,因爲數組裏沒有一個元素,因此也就不能對數組的元素進行操做。prototype

擴展

這位老兄的答案中附上了一個很是狂野的方法:code

Array.apply(null, Array(5)).map(Number.prototype.valueOf,0);

這段代碼能夠建立出一個長度爲5的全0數組。由於興趣因此我搜索了其餘建立全0數組的代碼放在下面:

new Array(5+1).join('0').split('')
var ary = new Uint8Array(10);
//ES6添加的fill方法
var arr = new Array(10);
arr.fill(0);

固然少不了最簡單粗暴的:

var arr = [];for(var n = 0; n < 100; n++) arr[n] = 0

有網友測試了上述方法的性能,結果發現原來簡單粗暴的arr[n] = 0的性能是最好的,哪怕你用arr.push(0)都弱爆了。建立全0數組測試 - jsperf.com

看來有時候優(zhuang)雅(bi)的方法不必定是最好的啊

相關文章
相關標籤/搜索