JavaScript中for循環(huán)的幾種寫法與效率總結(jié)
前言
對于for循環(huán),相信大家再常用不過了。但是這回說下for循環(huán)是因?yàn)榭创a時(shí)我居然沒有看明白一個(gè)for循環(huán)的意思,真是不應(yīng)該啊。
這個(gè)for循環(huán)是這么寫的:
for (var i = 0, rule; rule = rules[i++];) {
//do something
}
這個(gè)寫法是什么意思呢?后面再說,現(xiàn)賣個(gè)關(guān)子,這個(gè)寫法我感覺還是挺好的。
for循環(huán)寫法對效率的影響
說上面那段代碼之前,先說一下for循環(huán)的效率問題。在接觸js時(shí)關(guān)于for循環(huán)的寫法和對效率影響的文章挺不少的。但總的來說對于for循環(huán)的寫法有這么兩種:
- 不寫聲明變量的寫法:
for(var i = 0;i<arr.length;i++){} - 寫聲明變量的寫法:
for(var i = 0,len = arr.length;i < len;i++){}
除了for循環(huán)還有forEach() ,也有文章說forEach()效率最高,推薦用forEach()寫法,那么到底哪個(gè)效率高呢?做個(gè)測試來看看吧。
測試方案
總的測試方案如下:
- 做一個(gè)容納4千萬的測試數(shù)組變量。
- 分別用兩種寫法的for循環(huán)和foreach對這個(gè)測試變量進(jìn)行遍歷。
- 在同一臺(tái)穩(wěn)定機(jī)器上,進(jìn)行10次測試,最后取平均值。
- 測試環(huán)境:CPU:Inter(R) Core i5-3210M,RAM:12GM,system:win10(x64)
測試流程
制作測試變量
先用while循環(huán)做個(gè)測試變量出來,這個(gè)很簡單,具體如下:
var testArrs = [],
i = 0;
while(i<40000000){
testArrs.push(i);
i++;
}
編寫相應(yīng)測試函數(shù)
測量和執(zhí)行時(shí)間的代碼,我用的是console.time()和console.timeEnd()來進(jìn)行測試。
針對這個(gè)三個(gè)for循環(huán),先做出三個(gè)函數(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é)果有沒有讓你出乎意料呢?沒想到最平常的寫法效率最高,為什么?我也沒想明白,誰知道就告訴我吧,但我估計(jì)寫聲明的寫法是沒有意義的。因?yàn)?code>len = arr.length這個(gè)arr.length可能已經(jīng)緩存起來了,所以我們在聲明個(gè)len變量來存儲(chǔ)是沒有意義的。
最后附上全部測試代碼,復(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)的特殊寫法
下面說下文章剛開始說的那個(gè)我沒看懂的代碼,說之前先溫習(xí)下再熟悉不過的for循環(huán)語法。for循環(huán)的基本語法是:
for (語句 1; 語句 2; 語句 3)
{
被執(zhí)行的代碼塊
}
- 語句1:在循環(huán)(代碼塊)開始前執(zhí)行
- 語句2:定義運(yùn)行循環(huán)(代碼塊)的條件
- 語句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);
}
剛開始看的時(shí)候我也很疑惑,怎么能這么寫?語句2放的是循環(huán)條件,i–是什么判斷條件。其實(shí)不然,在語句2中,如果返回true循環(huán)會(huì)繼續(xù)執(zhí)行。在js中0,null,undefined,false,'',””作為條件判斷時(shí),其結(jié)果為false,也就說當(dāng)i–到0的時(shí)候就是false,循環(huán)就終止了。
再回到文章開頭的代碼
for (var i = 0, rule; rule = rules[i++];) {
//do something
}
這個(gè)rule = rules[i++]就是判斷條件,當(dāng)成為undefined時(shí)就會(huì)終止循環(huán)啦。所以這段代碼換成普通寫法就是這樣的:
for(var i = 0;i < rules.length;i++){
var rule = rules[i]
}
其實(shí)就是把判斷和賦值放到一起了,一邊循環(huán)一邊賦值。是不是挺簡單?
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學(xué)習(xí)或者使用Javascript能帶來一定的幫助,如果有疑問大家可以留言交流。
- JS數(shù)組的遍歷方式for循環(huán)與for...in
- js 數(shù)組的for循環(huán)到底應(yīng)該怎么寫?
- js for終止循環(huán) 跳出多層循環(huán)
- 淺談vue.js中v-for循環(huán)渲染
- 全面解析JavaScript里的循環(huán)方法之forEach,for-in,for-of
- javascript forEach通用循環(huán)遍歷方法
- javascript 循環(huán)語句 while、do-while、for-in、for用法區(qū)別
- JS 使用for循環(huán)遍歷子節(jié)點(diǎn)查找元素
- javascript下for循環(huán)用法小結(jié)
- JavaScript中三種for循環(huán)語句的使用總結(jié)(for、for...in、for...of)
相關(guān)文章
JavaScript異步回調(diào)的Promise模式封裝實(shí)例
這篇文章主要介紹了JavaScript異步回調(diào)的Promise模式封裝實(shí)例,本文通過分析easyjs的源碼得出,實(shí)例均參考easyjs,需要的朋友可以參考下2014-06-06
javascript實(shí)現(xiàn)tab切換特效
這篇文章主要介紹了javascript實(shí)現(xiàn)tab切換特效,實(shí)現(xiàn)的方法很簡單,特別適合初學(xué)者學(xué)習(xí)javascript實(shí)現(xiàn)tab切換特效,tab切換再也不是問題,需要的朋友可以參考下2015-11-11
js實(shí)現(xiàn)隨機(jī)數(shù)小游戲
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)隨機(jī)數(shù)小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
JavaScript實(shí)現(xiàn)圖像壓縮的方法
使用 JavaScript 和 canvas 壓縮圖像可以使用 canvas 的 drawImage() 方法將圖像繪制到 canvas 上,然后使用 toDataURL() 方法將圖像轉(zhuǎn)換為 Data URL 形式,這篇文章主要介紹了JavaScript 圖像壓縮的相關(guān)資料,需要的朋友可以參考下2023-01-01
IE8 下的Js錯(cuò)誤HTML Parsing Error...
今天調(diào)試一段JS代碼出現(xiàn)這個(gè)狀況..在火狐 IE7 和IE6下都正常...郁悶,在網(wǎng)上搜索了一下相關(guān)資料 一般錯(cuò)誤都是指所指定的標(biāo)簽沒有加載完就是用該對象....2009-08-08
js canvas實(shí)現(xiàn)驗(yàn)證碼并獲取驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)驗(yàn)證碼并獲取驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09

