1. 程式人生 > 其它 >JS中常見的幾種高階函式

JS中常見的幾種高階函式

什麼是高階函式?

高階函式英文叫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);