ECMAScript 5 为数组定义了5个迭代方法,分别是every(), some(), filter(), map() 和 forEach()
这五个方法都接收两个参数,第一个是将在数组中每一项上运行的函数,该函数接收三个参数,分别是该项的值,该项在数组中个索引,数组对象本身。第二个是可选参数,为运行该函数的作用域对象。
一、every() 和 some() 比较相似,用于查询数组中的项是否满足某个条件,every() 表示是否数组内的所有项都满足这个条件, some()表示是否至少有一项满足这个条件。比如判断数组内元素是否都大于0:
var nums = [-5, -4, 1, 2, 3, 4 ,5];
var everyResult = nums.every(function(item, index, array){
return item > 0;
});
console.log(everyResult); // false, 不是所有项都大于0
var someResult = nums.some(function(item, index, array){
return item > 0;
});
console.log(someResult); // true, 有项大于0
即对于every()来说,当传入的函数对每一项都返回true时,every()返回true; 对于some()来讲,当传入的函数对任一项返回true时,some()返回true。
二、filter() 顾名思义为用于过滤的方法,该方法返回符合筛选条件的数组项。
比如查询所有大于3的项:
var nums = [-5, -4, 1, 2, 3, 4 ,5];
var filterResult = nums.filter(function(item, index, array){
return item > 3;
});
console.log(filterResult);<span style="white-space:pre"> </span>// 输出[4, 5]
三、map()也返回一个数组,这个数组的每一项都是传入函数在原始数组中的对应项运行后的结果。
比如返回原始数组每一项乘2的数组:
var nums = [-5, -4, 1, 2, 3, 4 ,5];
var mapResult = nums.map(function(item, index, array){
item *= 2;
return item;
});
console.log(mapResult); // 输出 [-10, -8, 2, 4, 6, 8, 10]
需要注意的是改变item的值并不会影响原数组的值,只有通过index访问数组项才能修改原始数组的值。
var nums = [-5, -4, 1, 2, 3, 4 ,5];
var mapResult = nums.map(function(item, index, array){
item *= 2;
return item;
});
console.log(mapResult); // 输出 [-10, -8, 2, 4, 6, 8, 10]
console.log(nums); // 输出 [-5, -4, 1, 2, 3, 4, 5]
mapResult = nums.map(function(item, index, array){
array[index] *= 2;
return array[index];
});
console.log(mapResult); // 输出 [-10, -8, 2, 4, 6, 8, 10]
console.log(nums); // 输出 [-10, -8, 2, 4, 6, 8, 10]
三、forEach() 方法没有返回值,只是对数组中每一项运行传入函数,本质上和使用for循环是一样的。
var nums = [-5, -4, 1, 2, 3, 4 ,5];
nums.forEach(function(item, index, array){
//处理代码
});
最后,之所以总结迭代方法,因为看到了一个这样的题目:
1,以下表达式的运行结果是:
["1","2","3"].map(parseInt)
A.["1","2","3"]
B.[1,2,3]
C.[0,1,2]
D.其他
这个题目选D。
需要注意的是map()接收的参数有三个, parseInt接收的参数有两个分别是需要转换的值、转换数的进制。
所以题目相当于:
var result = ["1", "2", "3"].map(function(item, index, array){
return parseInt(item, index);
});
console.log(result); // [1, NaN, NaN]
parseInt 第二个参数如果省略或填0则按十进制转换,如果小于2或大于36则返回NaN。
所以parseInt 分别执行了parseInt("1", 0) 输出 1, parseInt("2", 1) 输出 NaN, parseInt("3", 2) 输出 NaN
其实关键还在于parseInt 接收两个参数,如果是parseFloat 就输出1,2,3而选B了。