abbshr / abbshr.github.io

人们往往接受流行,不是因为想要与众不同,而是因为害怕与众不同

Home Page:http://digitalpie.cf

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

盘点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

这两个方法用于数组元素的逻辑判定,他们对数组元素应用指定的函数来进行判定,返回truefalse

  • 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方法,将会抛出类型错误异常。