JavaScript高階函式
阿新 • • 發佈:2021-01-15
技術標籤: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);