高阶函数
高阶函数是函数式编程的一种代码实现方案,一般把接受一个或多个函数作为参数,或者返回一个函数的函数叫做高阶函数。
js中最常见的一些高阶函数如闭包(返回函数),一些内置函数(传入函数)等。
Array.prototype.reduce
例:
reduce接受两个参数,返回操作后的数据。
参数一(必须):函数累计器,声明要对数组的每一个值执行的操作,累计器默认被传入四个参数,分别表示累计器上一次返回累计值,数组正在处理的元素,正在处理的元素下标,调用reduce的数组;其中前两个必选,后两个可选。
参数二(可选):声明累计器的初始值,没有的话默认选择数组的第一个元素作为累计器的第一个值。
常见错误
当对空数组执行reduce操作时,必须指定参数二,保证累计器有一个初始值,否则会报错,如上图。
上图的代码执行顺序
- 将数组的第一个元素 1 作为累计器的初始值;
- 第一次循环,从数组的第二个元素开始,初始值1,当前值2,下标1;
- 第二次循环,初始值为之前的累计值 3,当前值3,下标2;
- 得到最终累计值为6,返回结果,计算结束下标1;
Array.prototype.map
例:
普通用法
数组包含空元素
复杂数组
回调函数所有参数
map可选参数测试
map接受两个参数
参数一(必须):一个回调函数,这个函数会被自动传入三个参数分别表示数组元素,数组下标,数组本身;函数内声明对原数组的每一项做的指定操作,并将得到的数据放入一个新数组并返回;
参数二(可选):用来指定回调函数中this的指向
常见错误
将['1','2','3']转换为数字数组
转换数字可以用parseInt,parseFloat,Number等方法,依次试验一下,结果如下:
这时候发现传入parseInt作为转换函数得不到想要的结果,回想一下,map接受的函数参数会被默认传入三个参数,而实际上,parseInt在使用过程中是可以接受两个参数的,第一个是解析的字符串,而第二个可选的参数,用来表示转换的进制,尝试一下:
所以错误的原因来自于此,当parseInt作为map的参数时,第二个参数被传入数组的下标,导致得不到想要的结果。
而parseFloat和Number则不存在这个问题。因为这两个函数都是智能接收一个字符串参数,并且返回转换后的结果。
Array.prototype.filter
示例:
filter接受两个参数
参数一(必选) 回调函数,指定过滤条件,回调函数接收三个参数,如上图所示,分别为当前处理的数组元素,当前处理的数组下标,调用filter的数组本身,并且返回一个过滤条件,符合条件的数组元素会被放入新数组返回;
参数二(可选) 同map,用来指定回调函数中this的指向;
通过高阶函数,我们还可以实现一些诸如函数缓存,函数柯里化等来提高js代码的性能及可读性,这个下次在说
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。