摘要:擴展這位老兄的答案中附上了一個非常狂野的方法這段代碼可以創建出一個長度為的全數組。創建全數組測試看來有時候優雅的方法不一定是最好的啊
問題
乍看之下,創建全0數組應該是一件不能再簡單的事情了:
var arr = [0,0,0,0,0,0];
然而有時候需要創建出長度比較長的全0數組(比如做桶排序時就需要),這種字面聲明可能就不太適合,因為不可能手打出幾萬個0。所以今天創建全0數組的時候,我用了以下方法:
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)的時候卻發現,結果是:
[NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN]
當時還以為自己map函數寫錯了,于是想了一個方法來驗證:
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等函數的時候,由于數組里沒有一個元素,所以也就不能對數組的元素進行操作。
這位老兄的答案中附上了一個非常狂野的方法:
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)的方法不一定是最好的啊
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86067.html
摘要:是什么存在于全局對象上,無需引入模塊即可使用,可見重要性非同一般。可以理解是在內存中開辟的一片區域,用于存放二進制數據。大小通過參數指定,默認情況下是。一般情況下位系統大約是,位系統大約是。 Buffer是什么? Buffer存在于全局對象上,無需引入模塊即可使用,可見重要性非同一般。可以理解Buffer是在內存中開辟的一片區域,用于存放二進制數據。Buffer所開辟的是堆外內存。 B...
摘要:如果數組已經為空,則不改變數組,并返回值。中所有在數組被修改時都遵從這個原則,以下不再重復方法會給原數組中的每個元素都按順序調用一次函數。每次執行后的返回值沒有指定返回值則返回組合起來 數組應該是我們在寫程序中應用到最多的數據結構了,相比于無序的對象,有序的數組幫我們在處理數據時,實在是幫了太多的忙了。今天剛好看到一篇Array.include的文章,忽然發現經過幾個ES3,ES5,E...
摘要:方法將所有在過濾函數中返回的數組元素放進一個新數組中并返回。方法從左到右為每個數組元素執行一次回調函數,并把上次回調函數的返回值放在一個暫存器中傳給下次回調函數,并返回最后一次回調函數的返回值。 創建數組 var array = new Array(); var array = new Array(10); var array = new Array(red,blue,green);...
摘要:數組方法全解析包含數組自帶屬性返回創建數組對象的原型函數返回數組對象的長度這個是老熟人了,可以增加數組的原型方法和屬性,這個放在后面的繼承中講數組的方法首先讓我們看看數組的對象屬性。 Javascript 數組方法全解析(包含es6) 1. 數組自帶屬性 constructor //返回創建數組對象的原型函數 length //返回數組對象的長度 prototype //這個是老...
摘要:關于我的博客掘金專欄路易斯專欄原文鏈接深度長文數組全解密全文共字,系統講解了數組的各種特性和。構造器構造器用于創建一個新的數組。中聲明的數組,它的構造函數是中的對象。 本文首發于CSDN網站,下面的版本又經過進一步的修訂。 關于 我的博客:louis blog 掘金專欄:路易斯專欄 原文鏈接:【深度長文】JavaScript數組全解密 全文共13k+字,系統講解了JavaScrip...
閱讀 3192·2023-04-26 01:39
閱讀 3345·2023-04-25 18:09
閱讀 1612·2021-10-08 10:05
閱讀 3228·2021-09-22 15:45
閱讀 2758·2019-08-30 15:55
閱讀 2393·2019-08-30 15:54
閱讀 3167·2019-08-30 15:53
閱讀 1324·2019-08-29 12:32