1. 程式人生 > 其它 >JavaScript高階函式

JavaScript高階函式

技術標籤:JavaScriptjs函數語言程式設計

什麼是高階函式呢?

高階函式源自於函數語言程式設計。

程式設計正規化: 指令式程式設計 / 宣告式程式設計
程式設計正規化: 面向物件程式設計(第一公民:物件) / 函數語言程式設計 (第一公民:函式)
那麼,JS作為一門“一切皆為物件”的語言,是如何擁有函數語言程式設計的能力呢?
是因為在JS中函式是一等公民,即函式可以被賦值給變數,被變數引用,這便使得函式可以作為引數,在其他函式間相互傳遞。

簡單來說就是函式本身需要的引數也是一個函式

看完以下案例 你就懂了:

現在有一個數組 外加3個需求,按照一般的做法是:

 <script>
// 現有一個數組 const nums = [45, 78, 62, 89, 111, 33, 411, 555]; // 1.需求:取出所有小於100的數字 let newNums = []; // new 一個新的陣列 然後遍歷 for (let n of nums) { if (n < 100) { newNums.push(n); // 追加到新陣列 } } console.log(newNums) // 2.需求 :在1的需求之上 把每個數乘以2進行轉化 let newNums2 = [
]; for (let n of newNums) { newNums2.push(n * 2); } console.log(newNums2) // 3.需求 在需求二之上,把數組裡的所有數相加 得出一個結果 let total = 0; for (let n of newNums) { total += n; } console.log(total); </script>

是不是覺得很繁瑣且不美觀。那我們一起來學高階函式吧

filter()

語法: array.filter(function(currentValue, indedx, arr), thisValue) 返回一個新的陣列

  • currentValue:必須。當前元素的值;
  • index:可選。當前元素的索引值;
  • arr:可選。當前元素屬於的陣列物件;
  • thisValue:可選。物件作為該執行回撥時使用,傳遞給函式,用作 “this” 的值。
  • 如果省略了 thisValue ,“this” 的值為 “undefined”。
  // n為陣列中的數字
    nums.filter(function(n){
    })

filter()中的回撥函式有一個要求,必須返回一個Boolean值,
true:當返回true時 函式內部會自動把這次回撥的n加入新的陣列中
false:當返回false時 函式內部自動把n過濾掉。

    // 1.需求:取出所有小於100的數字
    let newNums = nums.filter(function (n) {
      return n < 10;
    })

Map()

map() 方法返回一個新陣列,陣列中的元素為回撥函式處理後的值。

    // 2.需求 :在1的需求之上 把每個數乘以2進行轉化
    let newNums2 = newNums.map(function (n) {
      return n * 2;
    })

Reduce()

作用 對陣列中的所有數進行彙總。

// 3.需求 在需求二之上,把數組裡的所有數相加 得出一個結果
    let total = newNums2.reduce(function (preValue, n) {
      return preValue + n;
    }, 0)
    
    // 引數解析:
    /*          preValue : 上一次回撥函式返回的值   
             n : 當前傳入的值
             0 : 上一次回撥函式返回的值初始值 
             
             */

優化:

    let total = nums.filter(function (n) {
      return n < 100;
    }).map(function (n) {
      return n * 2;
    }).reduce(function (preValue, n) {
      return preValue + n;
    }, 0)

在這裡插入圖片描述

是不是覺得方便多了,,,但是它還不止於此

配合箭頭函式的最終版:

    let total = nums.filter(n => n < 100).map(n => n * 1).reduce((pre, n) => pre + n);