.forEach()
遍历数组。
arr.forEach(function(v, i, a){/* 执行体 */})
forEach()方法无法在所有元素都传递给调用函数之前终止,也就是说,它始终都会遍历完,没有类似与for循环中的break语句。如果要提前终止,必须把forEach()方法放在一个try块中,并且抛出一个异常。如果forEach()方法抛出foreach.break异常,循环会提前终止。
.map()
映射为新数组。
arr.map(function(x){return x * x;});
传递给map()的函数的调用方式跟跟传递给forEach()的函数的调用方式一样。但是传递map()的函数应该有一个返回值。注意,map()返回的是新数组,它不修改原始数组本身,如果原数组是稀疏数组,返回的数组也是稀疏数组:它具有相同的长度,相同的缺失元素。
.filter()
返回的数组元素是原始数组的一个子集。
arr.filter(function(x, i){return i % 2 == 0;})
传递的函数是用来逻辑判断的:该函数返回true或者false。如果返回值为true或是能转化true的值,那么传递给判断函数的元素就是filter()返回的子集的成员,它将被添加到作为filter()方法的返回值的数组中。
.every()和.some()
every()和some()是数组的逻辑判断,它们对数组元素运用指定函数进行判定,返回一个布尔值。
arr.every(function(x){return x % 2 == 0;})
arr.some(function(x){return x > 10;})
当且仅当数组中所有元素调用判定函数都返回true时,every()方法才返回true,否则,返回false。
当数组中至少有一个元素调用判定函数返回true时,some()方法就返回true,当且仅当数组中所有元素调用判定函数都返回false时,some()方法才返回false。
.reduce()和.reduceRight()
reduce()和reduceRight()方法使用知道的函数将数组进行组合,生成单个值。这在函数式编程当中是非常常见的操作,也可以称之为“注入”和“折叠”。
arr.reduce(function(x, y){return x + y;}, 0); // 数组求和
.reduce()需要2个参数,第一个是执行简化操作的函数,简化函数的任务就是定义一个方法将两个值化简成一个值,并返回简化后的值。第2个(可选)参数是传递给简化函数的一个初始值。.reduce()所使用的函数的第一个参数是目前位置简化操作的累计结果,如果是第一次调用,那么第一个参数是一个初始值,它是就是传递给.reduce()方法的第2个参数,如果没有指定其初始值,它将使用数组的第一个元素作为初始值。这意味着在上面的求和和求积的例子中,也可以省略第二个参数(初始值参数)。
[4,5,6,7,8].reduceRight(function(x, y){return x + "" + y;}); // 拼接字符串,得到:87654
[4,5,6,7,8].reduceRight(function(x, y){return x + "" + y;}, 0); // 拼接字符串,得到:087654
.reduceRight()唯一适用场合就是强调从右到左的运算的场合。不强调运算顺序的场合一律用.reduce()。
.indexOf()和.lastIndexOf()
类似于string类型的.indexOf()和.lastIndexOf(),搜索整个数组中具有给定值的元素,如果找到,返回第一个找到的元素的索引,如果没有找到,返回-1。.indexOf()从头到尾搜索,.lastIndexOf()则相反。
var arr = ['a', 'b', 'c', 'd', 'e'];
console.log(arr.indexOf('b')) //1
console.log(arr.lastIndexOf('e')) //4
注意,.lastIndexOf()找到元素后,索引依然是左往右计数,并不是右往左计数。使用.lastIndexOf()的唯一场合就是你明确知道你要的元素在队尾,而且队列非常长。其实,为了避免误解,应当少用.lastIndexOf(),多用.indexOf(),在现代浏览器下效率差异可以忽略。