1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        JavaScript 中哪一種循環(huán)最快呢?

        共 3690字,需瀏覽 8分鐘

         ·

        2021-04-21 23:18

        點(diǎn)擊上方 前端瓶子君,關(guān)注公眾號(hào)

        回復(fù)算法,加入前端編程面試算法每日一題群



        究竟哪一種循環(huán)更快?

        答案其實(shí)是:for(倒序)


        最讓我感到驚訝的事情是,當(dāng)我在本地計(jì)算機(jī)上進(jìn)行測試之后,我不得不接受 for(倒序)是所有 for 循環(huán)中最快的這一事實(shí)。下面我會(huì)舉個(gè)對一個(gè)包含超過一百萬項(xiàng)元素的數(shù)組執(zhí)行一次循環(huán)遍歷的例子。


        聲明:console.time() 結(jié)果的準(zhǔn)確度在很大程度上取決于我們運(yùn)行測試的系統(tǒng)配置。你可以在此處對準(zhǔn)確度作進(jìn)一步了解。

        const million = 1000000; 
        const arr = Array(million);
        console.time('?');
        for (let i = arr.length; i > 0; i--) {} // for(倒序)  :- 1.5ms
        for (let i = 0; i < arr.length; i++) {} // for          :- 1.6ms
        arr.forEach(v => v)                     // foreach      :- 2.1ms
        for (const v of arr) {}                 // for...of     :- 11.7ms
        console.timeEnd('?');

        造成這樣結(jié)果的原因很簡單,在代碼中,正序和倒序的 for 循環(huán)幾乎花費(fèi)一樣的時(shí)間,僅僅相差了 0.1 毫秒。原因是,for(倒序)只需要計(jì)算一次起始變量 let i = arr.length,而在正序的 for 循環(huán)中,它在每次變量增加后都會(huì)檢查條件 i<arr.length。這個(gè)細(xì)微的差別不是很重要,你可以忽略它。


        而 forEach 是 Array 原型的一個(gè)方法,與普通的 for 循環(huán)相比,forEach 和 for…of 需要花費(fèi)更多的時(shí)間進(jìn)行數(shù)組迭代。(譯者注:但值得注意的是,for…of 和 forEach 都從對象中獲取了數(shù)據(jù),而原型并沒有,因此沒有可比性。)


        循環(huán)的類型,以及我們應(yīng)該在何處使用它們

        1. For 循環(huán)(正序和倒序)

        我想,也許大家都應(yīng)該對這個(gè)基礎(chǔ)循環(huán)非常熟悉了。我們可以在任何我們需要的地方使用 for 循環(huán),按照核定的次數(shù)運(yùn)行一段代碼。最基礎(chǔ)的 for 循環(huán)運(yùn)行最迅速的,那我們每一次都應(yīng)該使用它,對嗎?并不然,性能不僅僅只是唯一尺度,代碼可讀性往往更加重要,就讓我們選擇適合我們應(yīng)用程序的變形即可。


        2. forEach

        這個(gè)方法需要接受一個(gè)回調(diào)函數(shù)作為輸入?yún)?shù),遍歷數(shù)組的每一個(gè)元素,并執(zhí)行我們的回調(diào)函數(shù)(以元素本身和它的索引(可選參數(shù))作為參數(shù)賦予給回調(diào)函數(shù))。forEach 還允許在回調(diào)函數(shù)中使用一個(gè)可選參數(shù) this。

        const things = ['have''fun''coding'];
        const callbackFun = (item, idex) => {
            console.log(`${item} - ${index}`);
        }
        things.foreach(callbackFun); 
        /* 輸出  
        have - 0
        fun - 1
        coding - 2 
        */


        3. for…of

        for…of 是在 ES6(ECMAScript 6)中實(shí)現(xiàn)標(biāo)準(zhǔn)化的。它會(huì)對一個(gè)可迭代的對象(例如 array、map、set、string 等)創(chuàng)建一個(gè)循環(huán),并且有一個(gè)突出的優(yōu)點(diǎn),即優(yōu)秀的可讀性。

        const arr = [3, 5, 7];
        const str = 'hello';
        for (let i of arr) {
           console.log(i); // 輸出 3, 5, 7
        }
        for (let i of str) {
           console.log(i); // 輸出 'h''e''l''l''o'
        }


        需要注意的是,請不要在生成器中使用 for……of,即便 for……of 循環(huán)提前終止。在退出循環(huán)后,生成器被關(guān)閉,并嘗試再次迭代,不會(huì)產(chǎn)生任何進(jìn)一步的結(jié)果。


        4. for in

        for…in 會(huì)在對象的所有可枚舉屬性上迭代指定的變量。對于每個(gè)不同的屬性,for…in 語句除返回?cái)?shù)字索引外,還將返回用戶定義的屬性的名稱。因此,在遍歷數(shù)組時(shí)最好使用帶有數(shù)字索引的傳統(tǒng) for 循環(huán)。因?yàn)?for…in 語句還會(huì)迭代除數(shù)組元素之外的用戶定義屬性,就算我們修改了數(shù)組對象(例如添加自定義屬性或方法),依然如此。

        const details = {firstName: 'john', lastName: 'Doe'};
        let fullName = '';
        for (let i in details) {
            fullName += details[i] + ' '; // fullName: john doe
        }


        for…of 和 for…in

        for…of 和 for…in 之間的主要區(qū)別是它們迭代的內(nèi)容。for…in 循環(huán)遍歷對象的屬性,而 for…of 循環(huán)遍歷可迭代對象的值。

        let arr= [4, 5, 6];
        for (let i in arr) {
           console.log(i); // '0''1''2'
        }
        for (let i of arr) {
           console.log(i); // '4''5''6'
        }


        結(jié)論

        for 最快,但可讀性比較差

        foreach 比較快,能夠控制內(nèi)容

        for...of 比較慢,但香

        for...in 比較慢,沒那么方便


        最后

        歡迎關(guān)注【前端瓶子君】??ヽ(°▽°)ノ?
        回復(fù)「算法」,加入前端編程源碼算法群,每日一道面試題(工作日),第二天瓶子君都會(huì)很認(rèn)真的解答喲!
        回復(fù)「交流」,吹吹水、聊聊技術(shù)、吐吐槽!
        回復(fù)「閱讀」,每日刷刷高質(zhì)量好文!
        如果這篇文章對你有幫助,在看」是最大的支持
        》》面試官也在看的算法資料《《
        “在看和轉(zhuǎn)發(fā)”就是最大的支持
        瀏覽 45
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩字幕 | 色原无码| www永久99啪啪片 | 日韩怡红院 | 性少妇√jdeos七xf一 美女被艹的网站 | 成人一区偷拍视频网站 | 综合网久久 | 93久久精品日日躁夜夜躁欧美 | 午夜福利精品视频 | 69**夜色精品国产69乱 |