最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

對(duì)于for循環(huán),相信大家再常用不過(guò)了。但是這回說(shuō)下for循環(huán)是因?yàn)榭创a時(shí)我居然沒(méi)有看明白一個(gè)for循環(huán)的意思,真是不應(yīng)該啊。

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

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

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

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

說(shuō)上面那段代碼之前,先說(shuō)一下for循環(huán)的效率問(wèn)題。在接觸js時(shí)關(guān)于for循環(huán)的寫法和對(duì)效率影響的文章挺不少的。但總的來(lái)說(shuō)對(duì)于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() ,也有文章說(shuō)forEach()效率最高,推薦用forEach()寫法,那么到底哪個(gè)效率高呢?做個(gè)測(cè)試來(lái)看看吧。

測(cè)試方案

總的測(cè)試方案如下:

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

測(cè)試流程

制作測(cè)試變量

先用while循環(huán)做個(gè)測(cè)試變量出來(lái),這個(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()來(lái)進(jìn)行測(cè)試。

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

foreach循環(huán)測(cè)試:

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

沒(méi)有聲明變量的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)過(guò)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é)果有沒(méi)有讓你出乎意料呢?沒(méi)想到最平常的寫法效率最高,為什么?我也沒(méi)想明白,誰(shuí)知道就告訴我吧,但我估計(jì)寫聲明的寫法是沒(méi)有意義的。因?yàn)?code>len = arr.length這個(gè)arr.length可能已經(jīng)緩存起來(lái)了,所以我們?cè)诼暶鱾€(gè)len變量來(lái)存儲(chǔ)是沒(méi)有意義的。

最后附上全部測(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)的特殊寫法

下面說(shuō)下文章剛開(kāi)始說(shuō)的那個(gè)我沒(méi)看懂的代碼,說(shuō)之前先溫習(xí)下再熟悉不過(guò)的for循環(huán)語(yǔ)法。for循環(huán)的基本語(yǔ)法是:

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

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

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

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

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

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

再回到文章開(kāi)頭的代碼

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)單?

總結(jié)

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

相關(guān)文章

  • webpack將js打包后的map文件詳解

    webpack將js打包后的map文件詳解

    下面小編就為大家分享一篇webpack將js打包后的map文件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 淺談JS中var,let和const的區(qū)別

    淺談JS中var,let和const的區(qū)別

    這篇文章主要介紹了淺談JS中var,let和const的區(qū)別,let和const是ES6新增的關(guān)鍵字,詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • uni-app的pages.json處理方案示例

    uni-app的pages.json處理方案示例

    這篇文章主要為大家介紹了uni-app的pages.json處理方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 詳解瀏覽器渲染頁(yè)面過(guò)程

    詳解瀏覽器渲染頁(yè)面過(guò)程

    這篇文章主要介紹了詳解瀏覽器渲染頁(yè)面過(guò)程的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • JavaScript使用indexOf()實(shí)現(xiàn)數(shù)組去重的方法分析

    JavaScript使用indexOf()實(shí)現(xiàn)數(shù)組去重的方法分析

    這篇文章主要介紹了JavaScript使用indexOf()實(shí)現(xiàn)數(shù)組去重的方法,結(jié)合實(shí)例形式分析了使用indexOf()方法進(jìn)行數(shù)組的判斷與去重相關(guān)原理與具體操作技巧,需要的朋友可以參考下
    2018-09-09
  • 如何在js中引入less的變量

    如何在js中引入less的變量

    這篇文章主要介紹了如何在js中引入less的變量,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 基于zepto.js實(shí)現(xiàn)仿手機(jī)QQ空間的大圖查看組件ImageView.js詳解

    基于zepto.js實(shí)現(xiàn)仿手機(jī)QQ空間的大圖查看組件ImageView.js詳解

    這篇文章主要介紹了基于zepto.js實(shí)現(xiàn)仿手機(jī)QQ空間的大圖查看組件ImageView.js的源碼和使用方法,并附上一個(gè)使用ImageView.js的實(shí)例,這里分享給大家,有需要的小伙伴參考下。
    2015-03-03
  • JavaScript?位運(yùn)算及實(shí)際應(yīng)用實(shí)例

    JavaScript?位運(yùn)算及實(shí)際應(yīng)用實(shí)例

    這篇文章主要為大家介紹了JavaScript位運(yùn)算及實(shí)際應(yīng)用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • bootstarp modal框居中顯示的實(shí)現(xiàn)代碼

    bootstarp modal框居中顯示的實(shí)現(xiàn)代碼

    這篇文章主要介紹了bootstarp modal框居中顯示的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-02-02
  • uniapp手寫滾動(dòng)選擇器的完整代碼(時(shí)間選擇器)

    uniapp手寫滾動(dòng)選擇器的完整代碼(時(shí)間選擇器)

    這篇文章主要介紹了uniapp手寫滾動(dòng)選擇器的完整代碼(時(shí)間選擇器),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-07-07

最新評(píng)論

博客| 蚌埠市| 高雄县| 关岭| 辽宁省| 西充县| 梅州市| 柯坪县| 屏东县| 达孜县| 安康市| 合水县| 边坝县| 嘉黎县| 兴业县| 胶州市| 沂南县| 黄山市| 睢宁县| 门源| 曲松县| 武汉市| 辽阳县| 华宁县| 四川省| 阿巴嘎旗| 泊头市| 株洲县| 兴城市| 都匀市| 永春县| 海阳市| 广宗县| 涪陵区| 崇文区| 银川市| 朝阳县| 玉山县| 高雄县| 云安县| 融水|