盘点ES5核心内容——数组篇
abbshr opened this issue · comments
如果说ES5中“对象“的新特性让你略有失望,那么”数组“上的特性绝对能让你兴奋不已。
数组的操作应该是新增特性中最多的,总体来讲,给人的感觉有些** 函数式 *味道:大多以函数作为参数,且函数的参数一般为 元素,索引,数组本身 *。
他们能够对数组元素进行** 遍历、映射、过滤、检测、简化、搜索 **。我暂且引用一下权威指南的内容:
forEach
该方法接受一个函数作为参数,从头到尾遍历数组同时为每个元素调用这个函数。但这个方法无法在数组遍历完之前停止,方法的返回值永远为undefined。
map
简单说就是映射:将每个元素传递给这个函数,并在最后返回一个新的数组,函数的返回值作为新数组中的元素。
[1, 2, , 3].map(function (elem) {
return elem + 1;
});
// [2, 3, , 4]
map并不会改变数组的长度,也就是说,如果原数组是个稀疏数组,经过map后仍是稀疏数组(不会操作不存在的索引)。
filter
他返回原数组的一个子集:对于数组中某个元素,如果传入的函数返回值能转化为true,那么该元素将成为新数组中的一员。
[1, 2, 3, , 4].filter(function (elem) {
return elem;
});
// [1, 2, 3, 4]
Note
需要注意的是,forEach、map和filter方法均** 不会处理不存在的索引及其元素 **。
forEah和filter只是简单的跳过未定义索引;map同样跳过未定义索引,但最后会将未定义索引的元素原封不动映射下来。
every、some
这两个方法用于数组元素的逻辑判定,他们对数组元素应用指定的函数来进行判定,返回true
和false
。
every
判断等价于”对于数组中所有元素“some
判断等价于”对于数组中存在一个满足条件的元素“
一旦确定了该返回true还是false,就会自动停止遍历数组。
[1, 2, 3, 4].every(function (elem) {
return elem > 3;
});
// false
reduce、reduceRight
他们使用指定的函数将数组元素进行组合,生成单个值。这一操作也称为”注入“/”折叠“。这两个方法可传入两个参数,第一个是用于折叠操作的的函数,这个函数的返回值作为折叠后的值。第二个参数为可选参数,用于初始化折叠操作的值(如果未指定该参数,默认将使用数组内第一个元素作为初始值)。作为第一个参数的函数,与前几个方法中使用的函数略有差异:
function (accumulator, elem, i, arr) { }
该函数的第一个参数是每次折叠后的值,开始时使用初始值填充。
reduceRight方法是按照从右向左的顺序处理数组的,与reduce处理顺序相反。
Note
如果对一个空数组调用不带初始值参数的reduce/reduceRight方法,将会抛出类型错误异常。