ES5为数组对象定义了5个迭代方法(即递归,简单的说就是自己可以调用自己)。
每个方法接收两个参数:要在每一项上运行的函数(接收3个参数:数组项的值,该项在数组中的位置,数组对象本身)和(可选的)运行该函数的作用域对象——影响this的值。
以下是这5个迭代方法的作用:
every()对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true ;
filter()对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组 ;
forEach()对数组中的每一项运行给定函数,这个方法没有返回值 ;
map()对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组 ;
some()对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true;
ps:以上方法不会修改数组中包含的值。
以上方法中,最相似的是every()和some()方法,他们都用于查询数组中的项是否满足某个条件。
对于every()来说,传入的函数必须每一项都返回true,这个方法才返回true;反之,返回false;
而some(),只要传入的函数对数组中的项有一项返回true,则返回true;也就是说some()方法返回false()的可能就是传入的和数组中完全对不上号的时候。------其实我看到这里,有没有觉得它和‘与或非’逻辑门很像?理解性的说,every()就是‘与’,some()就是‘或’,这样就好理解多了。
for example:
var numbers = [1,2,3,4,5,4,3,2,1];
var everyResult = numbers.every(function(item,index,array){
return (item>2);
});
alert(everyResult); //false;
var someResult = numbers.some(function(item,index,array){
return (item>2);
});
alert(someResult); //true;
以上代码调用了every()和some(),传入的函数只要给定项大于2就会返回true。
对于every(), 它返回的是 false,因为只有部分数组项符合条件。
对于 some(),结果就是 true,因为至少有一项是大于 2的。
filter()函数:它利用指定的函数确定是否在返回的数组中包含某一项。------跟jquery中filter()选择器类似,起一个过滤的作用,返回传入项与数组中相匹配的项。
for example:
var numbers = [1,2,3,4,5,4,3,2,1];
var filterResult = numbers.filter(function(item, index, array){ return (item > 2); });
alert(filterResult); //[3,4,5,4,3]
这里,通过调用 filter()方法创建并返回了包含 3、4、5、4、3的数组,因为传入的函数对它们 每一项都返回 true。这个方法对查询符合某些条件的所有数组项非常有用
map()也返回一个数组,而这个数组的每一项都是在原始数组中的对应项上运行传入函数的结果。------可以当作是遍历数组并对数组中的每一项执行所要执行的函数。
例如,可以给数组中的每一项乘以 2,然后返回这些乘积组成的数组,如下所示。
var numbers = [1,2,3,4,5,4,3,2,1];
var mapResult = numbers.map(function(item, index, array){ return item * 2; });
alert(mapResult); //[2,4,6,8,10,8,6,4,2]
以上代码返回的数组中包含给每个数乘以 2之后的结果。这个方法适合创建包含的项与另一个数组 一一对应的数组。
最后一个方法是 forEach(),它只是对数组中的每一项运行传入的函数。这个方法没有返回值, 本质上与使用 for 循环迭代数组一样。来看一个例子。
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item, index, array){ //执行某些操作 });
ps:这些数组方法通过执行不同的操作,可以大大方便处理数组的任务。支持这些迭代方法的浏览器有 IE9+、Firefox 2+、Safari 3+、Opera 9.5+和 Chrome。
pps:本人js小白一枚,以上仅是本人看书过程中看到的一些东西,也加一些自己理解的方法,若有不对,欢迎指正,谢谢。