首先,这些方法遵循着函数式编程较好的习惯:不改变原有的变量的值,即-不改变数组的元素的值。这些方法只是生成了新的数组,并将其返回。(若是使用foreach(),则会改变原来数组)
小贴士1:保持较好的函数式编程习惯:尽量不改变函数之外的变量; 将函数所需要的参数在参数列表里列清楚,即-全局变量也写进去;
小贴士2:ECMASCRIPT函数均是按值传递而非按引用传递,所以都是以副本的形式传递 假如传递全局变量数组,直接给数组赋值是不会改变原数组的,但push等方法是会改变原数组的!
-
map
这是map模板: arrOne.map(value/element, index, array) -
filter
根据调用者所提供的条件过滤数组 -
reduce
reduce 方法遍历数组中的每个项目并返回单个值(即字符串、数字、对象、数组)。
这是通过在每次迭代中调用一个回调函数来实现的。
回调函数接受四个参数。
第一个参数称为叠加器,它是上一次迭代中回调函数的返回值,第二个参数是当前正在处理的数组元素,第三个参数是该参数的索引,第四个参数是在其上调用 reduce 方法的数组。
除了回调函数,reduce 还有一个额外的参数做为叠加器的初始值。
如果没有第二个参数,会跳过第一次迭代,将叠加器初始值设置为第0号元素(这里注意了,要是这个数组类似于[{'a':''a' ,''w':'q'}],那这个是会出现按错误的,因为初始值不确定,所以最好有第二个参数,后面加的话无所谓,可以用use.a等形式指定要加哪一个,或者传入的数组先用map取出真正需要的部分)
总结就是,如果有初始值的话,回调函数就会从数组的第0项开始执行,也就是会执行arr.length次;
但是如果没有初始值的话,会默认取数组的第0项为初始值,回调函数会从数组的第1项开始执行,也就是会执行arr.length - 1次。
这点从我们手写一个reduce的实现就可以看出来,代码如下: