高阶函数:JS函数都指向某个变量,既然变量可以指向函数,函数的参数也能接受变量,那么一个函数就可以接受另一个函数作为参数。
指的是满足下列条件之一的函数:

  • 函数可以作为参数被传递
  • 函数可以作为返回值输出
  1. 元素的筛选--filter
    创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
    注意
    filter()不会对空数组进行检测
    filter()不会改变原始数组
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// 输出偶数列的数组
let sun = arr.filter(function(a) {
    return a % 2 === 0;
})
console.log(sum);  // [2, 4, 6, 8]
  1. map -- 映射
    调用Array的map()方法,传入我们自己的函数,就得到一个新的Array作为结果
function pow(x) {
    return x * x;
}

let arr =[1, 2, 3, 4, 5, 6, 7, 8, 9];
// map()传入的参数是pow,即函数对象本身
arr.map(pow);  // [1, 4, 9, 16, 25,  36, 49, 64, 81]

事实上,它把运算规则抽象了,还可以计算任意复杂的函数。
3. reduce()
Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果和序列的下一个元素做累积计算:

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
// 比方说对一个Array求和,就可以用reduuce实现

let arr = [1, 3, 5, 7, 9];
arr.reduce(function(x, y) {
    return x + y;
});  //25
  1. sort排序算法
    会修改原数组
    sort()方法默认把所有元素先转换为String再排序,结果'10'排在了'2'前面,因为字符'1'比字符'2'的ASCII码小,直接对数字排序,绝对掉进坑里。
    sort()是一个高阶函数,它可以接受一个比较函数来实现自定义的排序。
// 要按数字大小排序,可以这么写
let arr1 = [10, 20, 1, 2];
arr1.sort(function(x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
});  // [1, 2, 10, 20]

// 如果要倒序排序,我们可以把大的数放前面
let arr2 = [10, 20, 1, 2];
arr2.sort(function (x, y) {
    if (x < y) {
        return 1;
    }
    if (x > y) {
        return -1;
    }
    return 0;
});  // [20, 10, 2, 1]

// 对字符串排序,是按照ASCII的大小比较的,现在,排序应该忽略大小写,按照字母序排序
// 要实现这个算法,不必对现有代码大加改动,只有我们能定义出忽略大小写的比较算法就可以

let arr3 = ['Google', 'apple', 'Microsoft'];
arr3.sort(function (s1, s2) {
    x1 = s1.toUpperCase();
    x2 = s2.toUpperCase();
    if (x1 < x2) {
        return -1;
    }
    if (x1 > x2) {
        return 1;
    }
    return 0;
});  // ['apple', 'Goole', 'Microsoft']

// 忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较
let a1 = ['B', 'A', 'C'];
let a2 = a1.sort();
a1;  // ['A', 'B', 'C']
a2;  // ['A', 'B', 'C']
a1 === a2;  // true,a1和a2是同一对象
// sort()方法会直接对原Array进行修改,它返回的结果仍然是Array