欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中for循環(huán)的幾種寫法與效率總結(jié)

 更新時間:2017年02月03日 09:59:38   作者:yangchen  
每個接觸JS的開發(fā)人員都不可避免的與for循環(huán)打交道,畢竟這是遍歷必不可少的工具之一。然而當(dāng)循環(huán)次數(shù)比較大時,效率問題必須重視。下面這篇文章就主要介紹了JavaScript中幾種for循環(huán)的寫法與效率,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

對于for循環(huán),相信大家再常用不過了。但是這回說下for循環(huán)是因為看代碼時我居然沒有看明白一個for循環(huán)的意思,真是不應(yīng)該啊。

這個for循環(huán)是這么寫的:

for (var i = 0, rule; rule = rules[i++];) {
 //do something
}

這個寫法是什么意思呢?后面再說,現(xiàn)賣個關(guān)子,這個寫法我感覺還是挺好的。

for循環(huán)寫法對效率的影響

說上面那段代碼之前,先說一下for循環(huán)的效率問題。在接觸js時關(guān)于for循環(huán)的寫法和對效率影響的文章挺不少的。但總的來說對于for循環(huán)的寫法有這么兩種:

  1. 不寫聲明變量的寫法:for(var i = 0;i<arr.length;i++){}
  2. 寫聲明變量的寫法:for(var i = 0,len = arr.length;i < len;i++){}

除了for循環(huán)還有forEach() ,也有文章說forEach()效率最高,推薦用forEach()寫法,那么到底哪個效率高呢?做個測試來看看吧。

測試方案

總的測試方案如下:

  1. 做一個容納4千萬的測試數(shù)組變量。
  2. 分別用兩種寫法的for循環(huán)和foreach對這個測試變量進(jìn)行遍歷。
  3. 在同一臺穩(wěn)定機(jī)器上,進(jìn)行10次測試,最后取平均值。
  4. 測試環(huán)境:CPU:Inter(R) Core i5-3210M,RAM:12GM,system:win10(x64)

測試流程

制作測試變量

先用while循環(huán)做個測試變量出來,這個很簡單,具體如下:

var testArrs = [],
 i = 0;
while(i<40000000){
 testArrs.push(i);
 i++;
}

編寫相應(yīng)測試函數(shù)

測量和執(zhí)行時間的代碼,我用的是console.time()console.timeEnd()來進(jìn)行測試。

針對這個三個for循環(huán),先做出三個函數(shù)出來,他們分別是

foreach循環(huán)測試:

function testForeach(testArrs){
 console.time('foreach');
 var newArrs = [];
 testArrs.forEach(function(i){
 newArrs.push(i);
 });
 console.timeEnd('foreach');
}

沒有聲明變量的for循環(huán):

function testNoDeclare(testArrs){
 console.time('no declare');
 var newArrs = [];
 for(var i = 0;i<testArrs.length;i++){
 newArrs.push(i);
 }
 console.timeEnd('no declare');
}

有變量聲明的寫法

function testUseDeclare(testArrs){
 console.time('use declare');
 var newArrs = [];
 for(var i = 0,len = testArrs.length;i<len;i++){
 newArrs.push(i);
 }
 console.timeEnd('use declare');
}

執(zhí)行測試函數(shù)

執(zhí)行測試函數(shù)這里很簡單啦,就是調(diào)用函數(shù)就可以了

testForeach(testArrs);
testNoDeclare(testArrs);
testUseDeclare(testArrs);

測試結(jié)果

經(jīng)過10次測試,得到了以下結(jié)果

foreach 不寫聲明 寫聲明
2372.891ms 672.530ms 743.974ms
2431.821ms 710.275ms 805.676ms
2422.448ms 729.287ms 741.014ms
2330.894ms 730.200ms 755.390ms
2423.186ms 703.255ms 769.674ms
2379.167ms 689.811ms 741.040ms
2372.944ms 712.103ms 710.524ms
2316.005ms 726.518ms 726.522ms
2535.289ms 733.826ms 747.427ms
2560.925ms 793.680ms 817.098ms
平均值 平均值 平均值
2414.56ms 720.15ms 755.83ms

不知道結(jié)果有沒有讓你出乎意料呢?沒想到最平常的寫法效率最高,為什么?我也沒想明白,誰知道就告訴我吧,但我估計寫聲明的寫法是沒有意義的。因為len = arr.length這個arr.length可能已經(jīng)緩存起來了,所以我們在聲明個len變量來存儲是沒有意義的。

最后附上全部測試代碼,復(fù)制到自己的電腦上直接就可以測試了,要是有不合理的地方請告訴我吧

var testArrs = [],
 i = 0;
while(i<40000000){
 testArrs.push(i);
 i++;
}
function testForeach(testArrs){
 console.time('foreach');
 var newArrs = [];
 testArrs.forEach(function(i){
 newArrs.push(i);
 });
 console.timeEnd('foreach');
}
function testNoDeclare(testArrs){
 console.time('no declare');
 var newArrs = [];
 for(var i = 0;i<testArrs.length;i++){
 newArrs.push(i);
 }
 console.timeEnd('no declare');
}
function testUseDeclare(testArrs){
 console.time('use declare');
 var newArrs = [];
 for(var i = 0,len = testArrs.length;i<len;i++){
 newArrs.push(i);
 }
 console.timeEnd('use declare');
}
testForeach(testArrs);
testNoDeclare(testArrs);
testUseDeclare(testArrs);

for循環(huán)的特殊寫法

下面說下文章剛開始說的那個我沒看懂的代碼,說之前先溫習(xí)下再熟悉不過的for循環(huán)語法。for循環(huán)的基本語法是:

for (語句 1; 語句 2; 語句 3)
{
被執(zhí)行的代碼塊
}
  1. 語句1:在循環(huán)(代碼塊)開始前執(zhí)行
  2. 語句2:定義運行循環(huán)(代碼塊)的條件
  3. 語句3:在循環(huán)(代碼塊)已被執(zhí)行之后執(zhí)行

如果我們用for循環(huán)要輸出1到10,我們可以這么寫:

for(var i=0;i<10;i++){
console.log(i);
}

但是!根據(jù)上面的語法說明,我們也可以寫成這樣

for(var i=10;i--;){
console.log(i);
}

剛開始看的時候我也很疑惑,怎么能這么寫?語句2放的是循環(huán)條件,i–是什么判斷條件。其實不然,在語句2中,如果返回true循環(huán)會繼續(xù)執(zhí)行。在js中0,null,undefined,false,'',””作為條件判斷時,其結(jié)果為false,也就說當(dāng)i–到0的時候就是false,循環(huán)就終止了。

再回到文章開頭的代碼

for (var i = 0, rule; rule = rules[i++];) {
 //do something
}

這個rule = rules[i++]就是判斷條件,當(dāng)成為undefined時就會終止循環(huán)啦。所以這段代碼換成普通寫法就是這樣的:

for(var i = 0;i < rules.length;i++){
 var rule = rules[i]
}

其實就是把判斷和賦值放到一起了,一邊循環(huán)一邊賦值。是不是挺簡單?

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用Javascript能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 字符串反轉(zhuǎn)_JavaScript

    字符串反轉(zhuǎn)_JavaScript

    split()方法將一個字符串對象的每個字符拆出來,并且將每個字符串當(dāng)成數(shù)組的每個元素 reverse()方法用來改變數(shù)組,將數(shù)組中的元素倒個序排列,第一個數(shù)組元素成為最后一個,最后一個變成第一個 join()方法將數(shù)組中的所有元素邊接成一個字符串
    2016-04-04
  • JavaScript異步回調(diào)的Promise模式封裝實例

    JavaScript異步回調(diào)的Promise模式封裝實例

    這篇文章主要介紹了JavaScript異步回調(diào)的Promise模式封裝實例,本文通過分析easyjs的源碼得出,實例均參考easyjs,需要的朋友可以參考下
    2014-06-06
  • javascript實現(xiàn)tab切換特效

    javascript實現(xiàn)tab切換特效

    這篇文章主要介紹了javascript實現(xiàn)tab切換特效,實現(xiàn)的方法很簡單,特別適合初學(xué)者學(xué)習(xí)javascript實現(xiàn)tab切換特效,tab切換再也不是問題,需要的朋友可以參考下
    2015-11-11
  • 教你用Js寫一個簡單的五子棋小游戲

    教你用Js寫一個簡單的五子棋小游戲

    聽說這是一道騰訊的面試題,可能網(wǎng)上已經(jīng)有不少答案了,晚上沒事看到這道題就自己做了下,下面這篇文章主要給大家介紹了關(guān)于如何用Js寫一個簡單的五子棋小游戲的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • js實現(xiàn)隨機(jī)數(shù)小游戲

    js實現(xiàn)隨機(jī)數(shù)小游戲

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)隨機(jī)數(shù)小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • JS異步錯誤捕獲的一些事小結(jié)

    JS異步錯誤捕獲的一些事小結(jié)

    這篇文章主要給大家介紹了關(guān)于JS異步錯誤捕獲的一些事,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Javascript具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JavaScript實現(xiàn)圖像壓縮的方法

    JavaScript實現(xiàn)圖像壓縮的方法

    使用 JavaScript 和 canvas 壓縮圖像可以使用 canvas 的 drawImage() 方法將圖像繪制到 canvas 上,然后使用 toDataURL() 方法將圖像轉(zhuǎn)換為 Data URL 形式,這篇文章主要介紹了JavaScript 圖像壓縮的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • IE8 下的Js錯誤HTML Parsing Error...

    IE8 下的Js錯誤HTML Parsing Error...

    今天調(diào)試一段JS代碼出現(xiàn)這個狀況..在火狐 IE7 和IE6下都正常...郁悶,在網(wǎng)上搜索了一下相關(guān)資料 一般錯誤都是指所指定的標(biāo)簽沒有加載完就是用該對象....
    2009-08-08
  • JS鼠標(biāo)滾動分頁效果示例

    JS鼠標(biāo)滾動分頁效果示例

    在開發(fā)的時候為什么左邊的數(shù)據(jù)出來比右邊的慢呢?因為這里沒有進(jìn)行分頁,左邊的數(shù)據(jù)多,所以查詢相對較慢。怎么解決此問題呢?下面小編給大家?guī)砹薐S鼠標(biāo)滾動分頁效果示例,需要的的朋友參考下吧
    2017-07-07
  • js canvas實現(xiàn)驗證碼并獲取驗證碼功能

    js canvas實現(xiàn)驗證碼并獲取驗證碼功能

    這篇文章主要為大家詳細(xì)介紹了js canvas實現(xiàn)驗證碼并獲取驗證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論