前言
對(duì)于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)寫法對(duì)效率的影響
說上面那段代碼之前,先說一下for循環(huán)的效率問題。在接觸js時(shí)關(guān)于for循環(huán)的寫法和對(duì)效率影響的文章挺不少的。但總的來說對(duì)于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è)測(cè)試來看看吧。
測(cè)試方案
總的測(cè)試方案如下:
測(cè)試流程
制作測(cè)試變量
先用while循環(huán)做個(gè)測(cè)試變量出來,這個(gè)很簡(jiǎn)單,具體如下:
var testArrs = [], i = 0;while(i<40000000){ testArrs.push(i); i++;}編寫相應(yīng)測(cè)試函數(shù)
測(cè)量和執(zhí)行時(shí)間的代碼,我用的是console.time()和console.timeEnd()來進(jìn)行測(cè)試。
針對(duì)這個(gè)三個(gè)for循環(huán),先做出三個(gè)函數(shù)出來,他們分別是
foreach循環(huán)測(cè)試:
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í)行測(cè)試函數(shù)
執(zhí)行測(cè)試函數(shù)這里很簡(jiǎn)單啦,就是調(diào)用函數(shù)就可以了
testForeach(testArrs);testNoDeclare(testArrs);testUseDeclare(testArrs);
測(cè)試結(jié)果
經(jīng)過10次測(cè)試,得到了以下結(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é)果有沒有讓你出乎意料呢?沒想到最平常的寫法效率最高,為什么?我也沒想明白,誰(shuí)知道就告訴我吧,但我估計(jì)寫聲明的寫法是沒有意義的。因?yàn)?code>len = arr.length這個(gè)arr.length可能已經(jīng)緩存起來了,所以我們?cè)诼暶鱾€(gè)len變量來存儲(chǔ)是沒有意義的。
最后附上全部測(cè)試代碼,復(fù)制到自己的電腦上直接就可以測(cè)試了,要是有不合理的地方請(qǐng)告訴我吧
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)語(yǔ)法。for循環(huán)的基本語(yǔ)法是:
for (語(yǔ)句 1; 語(yǔ)句 2; 語(yǔ)句 3){被執(zhí)行的代碼塊}如果我們用for循環(huán)要輸出1到10,我們可以這么寫:
for(var i=0;i<10;i++){console.log(i);}但是!根據(jù)上面的語(yǔ)法說明,我們也可以寫成這樣
for(var i=10;i--;){console.log(i);}剛開始看的時(shí)候我也很疑惑,怎么能這么寫?語(yǔ)句2放的是循環(huán)條件,i 主站蜘蛛池模板: 财经| 威远县| 舟山市| 邵阳县| 麻栗坡县| 定远县| 宾阳县| 绥滨县| 永德县| 古浪县| 张家口市| 镶黄旗| 阳山县| 丹巴县| 驻马店市| 拉萨市| 南京市| 龙江县| 宝兴县| 辉县市| 离岛区| 连江县| 华坪县| 德钦县| 临夏县| 闸北区| 西峡县| 莒南县| 仪陇县| 临泉县| 南宫市| 万载县| 长乐市| 康保县| 潜江市| 屏山县| 新龙县| 亳州市| 青神县| 神农架林区| 唐山市|