JS中常見的幾種高階函式
阿新 • • 發佈:2021-07-12
什麼是高階函式?
高階函式英文叫Higher-order function。JavaScript的函式其實都指向某個變數。既然變數可以指向函式,函式的引數能接收變數,那麼一個函式就可以接收另一個函式作為引數,這種函式就稱之為高階函式。
舉個最簡單的高階函式
function add(x, y, f) { return f(x) + f(y); } //當呼叫add(-5, 6, Math.abs)時,引數x,y和f分別接收-5,6和函式Math.abs,根據函式定義,可以推導計算過程為: //x = -5; //y = 6; //f = Math.abs; //f(x) + f(y) ==> Math.abs(-5) + Math.abs(6) ==> 11; //return 11; //用程式碼驗證一下: add(-5, 6, Math.abs); // 11
編寫高階函式,就是讓函式的引數能夠接收別的函式
常見的高階函式
- map:map()方法定義在JavaScript的Array中,它返回一個新的陣列,陣列中的元素為原始陣列呼叫函式處理後的值。
function pow(x) { return x * x; } var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81] //map()傳入的引數是pow,即函式物件本身。 //不需要map(),寫一個迴圈,也可以計算出結果: var f = function (x) { return x * x; }; var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var result = []; for (var i=0; i<arr.length; i++) { result.push(f(arr[i])); }
所以,map()作為高階函式,事實上它把運算規則抽象了,因此,我們不但可以計算簡單的f(x)=x2,還可以計算任意複雜的函式,比如,把Array的所有數字轉為字串:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
//只需要一行程式碼。
- filter:filter也是一個常用的操作,它用於把Array的某些元素過濾掉,然後返回剩下的元素。和map()類似,Array的filter()也接收一個函式。和map()不同的是,filter()把傳入的函式依次作用於每個元素,然後根據返回值是true還是false決定保留還是丟棄該元素
//例如,在一個Array中,刪掉偶數,只保留奇數,可以這麼寫:
var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
return x % 2 !== 0;
});
r; // [1, 5, 9, 15]
//把一個Array中的空字串刪掉,可以這麼寫:
var arr = ['A', '', 'B', null, undefined, 'C', ' '];
var r = arr.filter(function (s) {
return s && s.trim(); // 注意:IE9以下的版本沒有trim()方法
});
arr; // ['A', 'B', 'C']
可見用filter()這個高階函式,關鍵在於正確實現一個“篩選”函式。
- sort()當對陣列arr = [1, 2, 5, 7, 8, 10, 11]進行排序時,10和11在2的前面,原因是陣列中的sort()方法排序,是先將元素轉換成String再排序,因為字元‘1’的ASCLL碼小於字元‘2’的,所以會出現這種錯誤
let arr = [1, 2, 5, 7, 8, 10, 11]
console.log(arr.sort())
解決上面的辦法是,sort()方法接收一個比較函式來實現自定義排序
let arr1 = [1, 2, 5, 7, 8, 10, 11]
function line(x, y) {
if (x < y) {
return -1; //當return -1時,為正向排序;當return 1時,為反向排序;
}
}
let newarr = arr1.sort(line)
console.log(newarr)//[1, 2, 5, 7, 8, 10, 11]
- reduce()累加陣列中的值
let arr = [1, 2, 5, 7, 8, 10, 11]
function add(x, y) {
return x + y;
}
let addValue = arr.reduce(add)
console.log(addValue);