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>

        【面試題】940- forEach() 和 map() 的區(qū)別

        共 3938字,需瀏覽 8分鐘

         ·

        2021-04-29 09:46

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

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

        1、返回值

        forEach()方法返回undefined ,而map()返回一個包含已轉換元素的新數(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,所以我們需要傳遞一個空數(shù)組來創(chuàng)建一個新的轉換后的數(shù)組。map()方法不存在這樣的問題,它直接返回新的轉換后的數(shù)組。在這種情況下,建議使用map()方法。

        2、鏈接其他方法

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

        另一方面,forEach()是一個終端方法,這意味著它不能與其他方法鏈接,因為它返回undefined。

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

        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

        當需要多個操作時,使用forEach()方法是一項非常乏味的工作。我們可以在這種情況下使用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位) 上運行上述代碼后的結果。建議復制上面的代碼,然后在自己控制臺中嘗試一下。

        forEach: 26.596923828125ms
        map:     21.97998046875ms

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

        4、中斷遍歷

        這兩種方法都不能用 break 中斷,否則會引發(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;
        });

        上面代碼會拋出 SyntaxError:

        ? Uncaught SyntaxError: Illegal break statement

        如果需要中斷遍歷,則應使用簡單的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()轉換數(shù)組的元素,因為它語法短,可鏈接且性能更好。

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

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

        本文完?

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

        1. JavaScript 重溫系列(22篇全)
        2. ECMAScript 重溫系列(10篇全)
        3. JavaScript設計模式 重溫系列(9篇全)
        4. 正則 / 框架 / 算法等 重溫系列(16篇全)
        5. Webpack4 入門(上)|| Webpack4 入門(下)
        6. MobX 入門(上) ||  MobX 入門(下)
        7. 120+篇原創(chuàng)系列匯總

        回復“加群”與大佬們一起交流學習~

        點擊“閱讀原文”查看 120+ 篇原創(chuàng)文章

        瀏覽 59
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        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>
            综合色亚洲 | 伊人78| 国产福利第一页 | 精品欧美国产日韩一区二区在线 | 看看欧美黑人操逼免费的 | 久久午夜无码鲁丝片午夜精品鲁丝 | 操逼视频网站免费看 | 丁香激情五月天 | 国产精品海角社区 | 又黄又爽在线观看 |