ECMAScript5中的五个迭代和两个归并的方法

ECMAScript5中的5个迭代和两个归并的方法

前言

前天写了一篇关于js数组的操作的方法,今天在重温高程的时候,突然,觉得自己在那一块漏了一个挺重要的一个模块了的,所以,今天就特地重开一篇文章,单独记录下这五个迭代和两个归并的方法。

其实,关于这些方法,只要你一百度,高端点就谷歌,这些博客一大堆,但是,为了能更深刻的记住,我还是觉得自己根据看到的东西,自己总结写一篇。

一、迭代的五个方法

1、介绍

这五个方法的共性:

1、每个方法都要接收两个参数(虽然我们一般看到的是都是一个直接被调用所要运行的函数):那就是要在每一项上运行的函数,以及运行该函数作用域对象——影响this的值。

2、传入这些方法中的函数都会接收三个参数:数组项的值 item、该项在数组中的位置 index、数组对象本身。

function(item,index,arr){.....)

2、作用

对数组中每一项运行给定的函数。如果该函数对每一项都返回true,则返回true。

对数组中每一项运行给定的函数。返回的结果是,符合给定函数的条件的数组项所组成的数组。

对数组中每一项运行给定的函数。记住:这个方法没有返回值。

对数组中每一项运行给定的函数。返回的结果是,每次函数调用的结果组成的数组。

对数组中每一项运行给定的函数。如果该函数对数组中的任意一项返回true,则返回true。

3、重点区分对象 every()和some():

在这些方法中,最相似的是every()和some(),它们都用于查询数组中的项是否满足某个条件。

那么重点就来了>_<

A 、对于every()来说,传入的函数都返回true,这个方法才会返回true,否则,它就会返回false。

B、而对于some()来说,只要传入的函数对数组中任意一项返回了true,那么就会返回true,也就是说满足了其中一项即可。

以上的代码就是调用了every()和some()方法,传入的参数只要满足数组项大于2就会返回true。这对于every()来说,它返回的是false,因为它只有部分数组符合条件,而对于some()来说,结果就是true,因为它至少有一项是大于2的。

4、次重点区分对象filter()和map()

A 、filter()函数

下边我们再来看一下filter()函数,它利用指定的函数确定是否在返回的数组中包含某一项。例如要返回一个所有数值都大于2的数组。

这里返回了数组[3, 4, 5, 6, 7, 8],因为传入的函数对它们的每一项都返回了true。这个方法对查询符合某些条件的数组项非常有用。

B、map()函数

map()也返回一个数组,而这个数组的每一项都是在原始数组中的对应项上传入函数的结果。例如,可以给数组中的每一项乘以2,然后返回这些乘积组成的数组。

5、孤零零的但是重要的foreach()

这里别看我不给它找一个对象来做对比就不显得它不重要啊,是你想太多……,这个方法是对数组中的每一项运行传入的函数。再次提醒一下,这个方法没有返回值,本质上是与使用for循环迭代数组一样

二、归并的两个方法

ECMAScript5新增了两个归并的方法reduce()和reduceRight()。这两个方法都会迭代数组中的所有项,然后构建一个最终返回的值。

1、区别:

A、reduce()是从数组的第一项开始,逐个遍历到最后一项。

B、reduceRight()是从数组的最后一项开始,向前遍历到第一项。

2、共性:

A、这两个方法都接收两个参数:一个是每一项上调用的函数和(可选的)作为归并基础的初始值。

B、传给reduce()和reduceRight()的函数接收4个参数:前一个值,当前值,项的索引。数组对象

function(prev,cur,index,array)

C、这个函数返回的任何值都会作为第一个参数自动传给下一项,reduce()第一次迭代发生在数组的前两项上,因此第一个参数使用的是数组的第一项,第二个参数使用的是数组的第二项,当然,reduceRight()是反过来的。

3、reduce()函数从数组左边计算到数组右边

第一次执行回调函数,prev是1,cur是2。第二次,prev是3(1加2的结果),cur是3(数组的第三项)。这个过程会持续到把数组中的每一项都访问一遍,最后返回结果。

4、reduceRight()函数从数组右边计算到数组左边

第一次执行回调函数,prev是5,cur是4。当然,接下来的就不多说了,结果还是一样的,只不过是计算方向反过来的而已。除了计算方向相反之外,它们是完全一样的。