JavaScript中for迴圈的幾種寫法與效率總結
前言
對於for迴圈,相信大家再常用不過了。但是這回說下for迴圈是因為看程式碼時我居然沒有看明白一個for迴圈的意思,真是不應該啊。
這個for迴圈是這麼寫的:
1 2 3 |
|
這個寫法是什麼意思呢?後面再說,現賣個關子,這個寫法我感覺還是挺好的。
for迴圈寫法對效率的影響
說上面那段程式碼之前,先說一下for迴圈的效率問題。在接觸js時關於for迴圈的寫法和對效率影響的文章挺不少的。但總的來說對於for迴圈的寫法有這麼兩種:
- 不寫宣告變數的寫法:
for(var i = 0;i<arr.length;i++){}
- 寫宣告變數的寫法:
for(var i = 0,len = arr.length;i < len;i++){}
除了for迴圈還有forEach()
,也有文章說forEach()
效率最高,推薦用forEach()
寫法,那麼到底哪個效率高呢?做個測試來看看吧。
測試方案
總的測試方案如下:
- 做一個容納4千萬的測試陣列變數。
- 分別用兩種寫法的for迴圈和foreach對這個測試變數進行遍歷。
- 在同一臺穩定機器上,進行10次測試,最後取平均值。
- 測試環境:CPU:Inter(R) Core i5-3210M,RAM:12GM,system:win10(x64)
測試流程
製作測試變數
先用while迴圈做個測試變量出來,這個很簡單,具體如下:
1 2 3 4 5 6 |
|
編寫相應測試函式
測量和執行時間的程式碼,我用的是console.time()
和console.timeEnd()
來進行測試。
針對這個三個for迴圈,先做出三個函數出來,他們分別是
foreach迴圈測試:
1 2 3 4 5 6 7 8 |
|
沒有宣告變數的for迴圈:
1 2 3 4 5 6 7 8 |
|
有變數宣告的寫法
1 2 3 4 5 6 7 8 |
|
執行測試函式
執行測試函式這裡很簡單啦,就是呼叫函式就可以了
1 2 3 |
|
測試結果
經過10次測試,得到了以下結果
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 |
不知道結果有沒有讓你出乎意料呢?沒想到最平常的寫法效率最高,為什麼?我也沒想明白,誰知道就告訴我吧,但我估計寫宣告的寫法是沒有意義的。因為len = arr.length
這個arr.length
可能已經快取起來了,所以我們在宣告個len變數來儲存是沒有意義的。
最後附上全部測試程式碼,複製到自己的電腦上直接就可以測試了,要是有不合理的地方請告訴我吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
for迴圈的特殊寫法
下面說下文章剛開始說的那個我沒看懂的程式碼,說之前先溫習下再熟悉不過的for迴圈語法。for迴圈的基本語法是:
1 2 3 4 |
|
- 語句1:在迴圈(程式碼塊)開始前執行
- 語句2:定義執行迴圈(程式碼塊)的條件
- 語句3:在迴圈(程式碼塊)已被執行之後執行
如果我們用for迴圈要輸出1到10,我們可以這麼寫:
1 2 3 |
|
但是!根據上面的語法說明,我們也可以寫成這樣
1 2 3 |
|
剛開始看的時候我也很疑惑,怎麼能這麼寫?語句2放的是迴圈條件,i–是什麼判斷條件。其實不然,在語句2中,如果返回true迴圈會繼續執行。在js中0,null,undefined,false,'',””作為條件判斷時,其結果為false,也就說當i–到0的時候就是false,迴圈就終止了。
再回到文章開頭的程式碼
1 2 3 |
|
這個rule = rules[i++]就是判斷條件,當成為undefined時就會終止迴圈啦。所以這段程式碼換成普通寫法就是這樣的:
1 2 3 |
|
其實就是把判斷和賦值放到一起了,一邊迴圈一邊賦值。是不是挺簡單?
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用Javascript能帶來一定的幫助,如果有疑問大家可以留言交流。