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>

        面試官問:forEach() 和 map() 的區(qū)別

        共 3842字,需瀏覽 8分鐘

         ·

        2021-04-06 19:12

        今天我們來看一下 Array中 Array.forEach()和 Array.map()方法之間的區(qū)別。

        forEach()和map()方法通常用于遍歷Array元素,但幾乎沒有區(qū)別,我們來一一介紹。

        1、返回值

        forEach()方法返回undefined ,而map()返回一個(gè)包含已轉(zhuǎn)換元素的新數(shù)組。

        const numbers = [12345];

        // 使用 forEach()
        const squareUsingForEach = [];
        numbers.forEach(x => squareUsingForEach.push(x*x));

        // 使用 map()
        const squareUsingMap = numbers.map(x => x*x);

        console.log(squareUsingForEach); // [1, 4, 9, 16, 25]
        console.log(squareUsingMap);     // [1, 4, 9, 16, 25]

        由于forEach()返回undefined,所以我們需要傳遞一個(gè)空數(shù)組來創(chuàng)建一個(gè)新的轉(zhuǎn)換后的數(shù)組。map()方法不存在這樣的問題,它直接返回新的轉(zhuǎn)換后的數(shù)組。在這種情況下,建議使用map()方法。

        2、鏈接其他方法

        map()方法輸出可以與其他方法(如reduce()、sort()、filter())鏈接在一起,以便在一條語句中執(zhí)行多個(gè)操作。

        另一方面,forEach()是一個(gè)終端方法,這意味著它不能與其他方法鏈接,因?yàn)樗祷豼ndefined。

        我們使用以下兩種方法找出數(shù)組中每個(gè)元素的平方和:

        onst numbers = [12345];

        // 使用 forEach()
        const squareUsingForEach = []
        let sumOfSquareUsingForEach = 0;
        numbers.forEach(x => squareUsingForEach.push(x*x));
        squareUsingForEach.forEach(square => sumOfSquareUsingForEach += square);

        // 使用 map()
        const sumOfSquareUsingMap = numbers.map(x => x*x).reduce((total, value) => total + value)
        ;

        console.log(sumOfSquareUsingForEach); // 55
        console.log(sumOfSquareUsingMap);     // 55

        當(dāng)需要多個(gè)操作時(shí),使用forEach()方法是一項(xiàng)非常乏味的工作。我們可以在這種情況下使用map()方法。

        3、性能

        // Array:
        var numbers = [];
        for ( var i = 0; i < 1000000; i++ ) {
            numbers.push(Math.floor((Math.random() * 1000) + 1));
        }

        // 1. forEach()
        console.time("forEach");
        const squareUsingForEach = [];
        numbers.forEach(x => squareUsingForEach.push(x*x));
        console.timeEnd("forEach");

        // 2. map()
        console.time("map");
        const squareUsingMap = numbers.map(x => x*x);
        console.timeEnd("map");

        這是在MacBook Pro的 Google Chrome v83.0.4103.106(64位) 上運(yùn)行上述代碼后的結(jié)果。建議復(fù)制上面的代碼,然后在自己控制臺(tái)中嘗試一下。

        forEach: 26.596923828125ms
        map:     21.97998046875ms

        顯然,map()方法比forEach()轉(zhuǎn)換元素要好。

        4、中斷遍歷

        這兩種方法都不能用 break 中斷,否則會(huì)引發(fā)異常:

        const numbers = [12345];

        // break; inside forEach()
        const squareUsingForEach = [];
        numbers.forEach(x => { 
          if(x == 3break// <- SyntaxError 
          squareUsingForEach.push(x*x);
        });

        // break; inside map()
        const squareUsingMap = numbers.map(x => {
          if(x == 3break// <- SyntaxError 
          return x*x;
        });

        上面代碼會(huì)拋出 SyntaxError:

        ? Uncaught SyntaxError: Illegal break statement

        如果需要中斷遍歷,則應(yīng)使用簡單的for循環(huán)或for-of/for-in循環(huán)。

        const numbers = [12345];

        //break;insidefor-ofloop
        const squareUsingForEach = [];
        for(x of numbers){
          if(x == 3break;
          squareUsingForEach.push(x*x);
        };

        console.log(squareUsingForEach); //[1,4]

        5、最后

        建議使用map()轉(zhuǎn)換數(shù)組的元素,因?yàn)樗Z法短,可鏈接且性能更好。

        如果不想返回的數(shù)組或不轉(zhuǎn)換數(shù)組的元素,則使用forEach() 方法。

        最后,如果要基于某種條件停止或中斷數(shù)組的便利,則應(yīng)使用簡單的for循環(huán)或for-of / for-in循環(huán)。

        本文完?

        來源 | https://codingnconcepts.com/javascript/difference-between-foreach-and-map-in-javascript-array/

        最后

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

        手機(jī)掃一掃分享

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

        手機(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>
            成人 视频在线观看 | 操操综合网 | 欧美美熟妇激情一区二区三区在线 | 色国产精品女五丁香五月五月 | 天天拍天天操 | 天天撸天天干天天日 | 成人性生活免费视频 | 成人视频在线观看高清无码网站 | 国产一级视频 | 亚洲午夜成人视频 |