高阶函数(Higher-order function),就是接受其他函数作为参数之一的函数
。
实例:
function add(x, y, f) {
return f(x) + f(y);
}
// 调用:
add(-2, -3, Math.abs);
Array
对象的几种高阶函数。sort()
对数组元素进行排序(原地算法 In-place Algorithm),并返回当前数组(已排序)。默认排序是先将数组元素全部转换为字符串,然后根据字符串Unicode码点
。arr.sort(?compareFn)
, 其中高阶函数compareFn
的函数声明为:compareFn(a, b)
。filter()
将所有在过滤函数中返回true
的元素放进一个新的数组中并返回。arr.filter(callbackFn, ?thisArg)
, 其中callbackFn(element, ?index, ?array)
。map()
返回一个由回调函数的返回值组成的新数组。arr.map(callbackFn, ?thisArg)
, 其中callbackFn(currentValue, ?index, ?array)
。reduce()
从左到右为每个数组元素执行一次回调函数,并把上次回调函数的返回值放在一个暂存器中传给下次回调函数,并返回最后一次回调函数的反追至。arr.reduce(callbackFn, ?initialValue)
, 其中callbackFn(accumulator, currentValue, ?currentIndex, ?array)
。reduceRight()
从右边开始,从右向左。arr.reduceRight(callbackFn, ?initialValue)
, 其中callbackFn(previousValue, currentValue, ?currentValue, ?array)
。sort(?coompareFn)
arr = [1, 5, 6, 22, 34];
arr.sort();
// [1, 22, 34, 5, 6],默认排序是根据字符串码点。
arr.sort(function(a, b) {
return a - b;
});
// [1, 22, 34, 5, 6]
filter(callbackFn, ?thisArg)
arr = [1,2,3,4,5,6];
arr.filter(function(element, index, array) {
return element % 2 == 0; // 过滤偶数。
});
// (3) [2, 4, 6]
arr = [1, 5, 6, "234", false];
arr.filter(function(element, index, array) {
return (typeof element == "number"); // 过滤数值
});
// (3) [1, 5, 6]
map(callbackFn, ?thisArg)
arr = [1, 2, 3, 4, 5];
arr.map(function(currentValue, index, array) {
return Math.pow(currentValue, 2); // 返回数组元素的2次方。
});
// (5) [1, 4, 9, 16, 25]
reduce(callbackFn, ?initialValue)
arr = [1, 2, 3, 4, 5];
arr.reduce(function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue; // 数组元素求和
});
// 把数组元素拼接成一个字符串
arr = [1, 2, 3, false, "test", null, undefined];
arr.reduce(function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
}, ""); // initialValue为空字符串""。
reduceRight(callbackFn, ?initialValue)
// reduceRight()与reduce()不同的是:方向从右向左。
arr = [1, 2, 3, 4, 5];
arr.reduce(function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
}, ""); // "12345"
arr.reduceRight(function(accumulator, currentValue, currentIndex, array) {
return accumulator + currentValue;
}, ""); // "54321"