首頁  >  文章  >  web前端  >  JavaScript中for迴圈的幾種寫法與效率總結

JavaScript中for迴圈的幾種寫法與效率總結

高洛峰
高洛峰原創
2017-02-03 13:27:001744瀏覽

前言

對於for循環,相信大家再常用不過了。但這回說下for迴圈是因為看程式碼時我居然沒有看明白一個for迴圈的意思,真是不應該啊。

這個for循環是這麼寫的:

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

這個寫法是什麼意思呢?後面再說,現賣個關子,這個寫法我覺得還挺好的。

for循環寫法對效率的影響

說上面那段程式碼之前,先說一下for循環的效率問題。在接觸js時關於for迴圈的寫法和對效率影響的文章挺不少的。但總的來說對於for迴圈的寫法有這麼兩種:

不寫宣告變數的寫法:for(var i = 0;i

寫宣告變數的寫法:for (var i = 0,len = arr.length;i

除了for迴圈還有forEach() ,也有文章說forEach()效率最高,建議用forEach()寫法,那麼到底哪個效率高呢?做個測試來看看吧。

測試方案

總的測試方案如下:

做一個容納4千萬的測試數組變數。

分別用兩種寫法的for迴圈和foreach對這個測試變數進行遍歷。

在同一台穩定機器上,進行10次測試,最後取平均值。

測試環境:CPU:Inter(R) Core i5-3210M,RAM:12GM,system:win10(x64)

測試流程

製作測試變數

先用while循環做測試變數,這個很簡單,具體如下:

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

編寫對應測試函數

測量和執行時間的程式碼,我用的是console.time()和console.timeEnd()來進行測試。

針對這個三個for循環,先做出三個函數出來,他們分別是

foreach循環測試:

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

沒有聲明變數的for循環:

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

沒有聲明變數的for循環:

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

有變數聲明的寫法

執行測試函數

執行測試函數這裡很簡單啦,就是調用函數就可以了

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

測試結果

JavaScript中for迴圈的幾種寫法與效率總結經過10次測試,得到了以下結果沒有不知道

測試結果

經過10次測試,得到了以下結果沒有不知道讓你出乎意料呢?沒想到最平常的寫法效率最高,為什麼?我也沒想明白,誰知道就告訴我吧,但我估計寫聲明的寫法是沒有意義的。因為len = arr.length這個arr.length可能已經快取起來了,所以我們在宣告個len變數來儲存是沒有意義的。

最後附上全部測試程式碼,複製到自己的電腦上直接就可以測試了,如果有不合理的地方請告訴我吧

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

   

for循環的特殊寫法

開始說的那個我沒看懂的程式碼,說之前先溫習下再熟悉不過的for循環語法。 for迴圈的基本語法是:

for (语句 1; 语句 2; 语句 3)
{
被执行的代码块
}

語句1:在迴圈(程式碼區塊)開始前執行

語句2:定義執行迴圈(程式碼區塊)的條件

語句3:在迴圈(程式碼區塊)已被執行後執行

如果我們用for迴圈要輸出1到10,我們可以這麼寫:

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

但是!根據上面的文法說明,我們也可以寫成這樣

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

剛開始看的時候我也很疑惑,怎麼能這麼寫?語句2放的是循環條件,i–是什麼判斷條件。其實不然,在語句2中,如果回傳true迴圈會繼續執行。在js中0,null,undefined,false,'',”」作為條件判斷時,其結果為false,也就說當i–到0的時候就是false,循環就終止了。

再回到文章開頭的程式碼

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

這個rule = rules[i++]就是判斷條件,當成為undefined時就會終止循環啦。所以這段程式碼換成普通寫法就是這樣的:

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

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

總結

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

更多JavaScript中for循環的幾種寫法與效率總結相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn