高阶函数

高阶函数

在JavaScript的世界中,万物皆为对象,而函数同样也是对象;

我们可以声明一个变量来指向函数对象,同样的,我们也可以用函数对象作为参数传递给另一个函数;

1
2
3
4
function add(x, y, f) {
// f 指向了一个函数对象
return f(x) + f(y);
}

f函数的实现可以是任意的,但是必须确保其至少接收一个参数,并有一个返回值:

1
2
3
4
5
6
7
8
9
add(-5, 6, Math.abs)

等价于:

x = -5;
y = 6;
f = Math.abs;
f(x) + f(y) ==> Math.abs(-5) + Math.abs(6) ==> 11;
return 11;

[TOC]

map

Array.map(callback(currentValue[, index, array])[, thisArg])

1
2
3
4
5
6
7
8
9
'use strict';

function pow(x) {
return x * x;
}

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);

reduce

Array.reduce(callback(acc[, currValue, index, array])[, initialValue])

initialValue在没有传递的情况下,默认是数组的第一个元素,在空数组中,没有传递则会报错!

将字符串装换为对应的数字:

1
2
3
4
5
'use strict';

function string2int(s) {
return s.split('').map(x => x*1).reduce(function(x, y){return x*10+y});
}

filter

arr.filter(callback(element[, index[, array]])[, thisArg])

1
2
3
4
5
6
var arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];

// 过滤掉重复元素
r = arr.filter(function (element, index, self) {
return self.indexOf(element) === index;
});

sort

array.sort([compareFunction])

如果不提供比较函数,那么默认的会将数组元素转换为字符,然后比较他们的ASCII码;

不同于其他的高阶函数,sort函数直接对Array内容进行修改,返回的结果数组和原来的数组是同一个数组;

正序排序:

1
2
3
4
5
6
7
8
9
10
11
12
var arr = [10, 20, 1, 2];

arr.sort(function (x, y) {
if (x < y) {
return -1;
}
if (x > y) {
return 1;
}
return 0;
});
console.log(arr); // [1, 2, 10, 20]