高阶函数英文叫Higher-order function。什么是高阶函数?
JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
一个最简单的高阶函数:
1 | function add(x, y, f) { |
map
这个区别于Map
,map
是Array
的一个方法。
举例说明,比如我们有一个函数f(x)=x2
,要把这个函数作用在一个数组[1, 2, 3, 4, 5, 6, 7, 8, 9]
上,就可以用map
实现如下:
alt=’map用法图例’
具体的代码实现如下:
1 | ; |
##reduceArray
的reduce()
把一个函数作用在这个Array
的[x1, x2, x3…]
上,这个函数必须接收两个参数,reduce()
把结果继续和序列的下一个元素做累积计算,其效果就是:
1 | [1, 2, 3, 4].reduce(f) = f( f( f(1, 2) , 3), 4) |
比方说对一个Array求和,就可以用reduce实现:
1 | var arr = [1, 3, 5, 7, 9]; |
总结的例子
用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT']
,输出:['Adam', 'Lisa', 'Bart']
,可以这样写。
1 | function normalize(arr){ |
filter
filter
也是一个常用的操作,它用于把Array
的某些元素过滤掉,然后返回剩下的元素。也可以这么理解,filter
的回调函数把Array
的每个元素都处理一遍,处理结果返回false则过滤结果去除该元素,true
则留下来。看个例子:
1 | var arr = [1, 2, 4, 5, 6, 9, 10, 15]; |
用filter()
这个高阶函数,关键在于正确实现一个“筛选”函数。
其实这个筛选函数有多个参数,filter(function (element, index, self)
,像这样:
1 | var arr = ['A', 'B', 'C']; |
演示一个使用filter去重
1 | ; |
sort排序算法
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x和y,如果认为x < y
,则返回-1
,如果认为x == y
,则返回0
,如果认为x > y
,则返回1
,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。
值得注意的
1 | // 看上去正常的结果: |
原因
第二个排序把apple排在了最后,是因为字符串根据ASCII码进行排序,而小写字母a的ASCII码在大写字母之后。
第三个排序结果是什么鬼?简单的数字排序都能错?
这是因为Array
的sort()
方法默认把所有元素先转换为String
再排序,结果’10’
排在了’2’
的前面,因为字符’1’
比字符’2’
的ASCII
码小。
看个大小排序的例子:
1 | ; |
解读一下:传入x,y
,如果x<y
,返回-1
,x
与前面排,如果x>y
,返回1
,x
后面排,如果x=y
,无所谓谁拍谁前面。
还有一个,sort()
方法会直接对Array
进行修改,它返回的结果仍是当前Array
,一个栗子:
1 | var a1 = ['B', 'A', 'C']; |