ECMAScript 5中定义了9个新的数组方法,用于遍历、映射、过滤、检测、简化和搜索数组。

在开始介绍之前,很有必要对这几个新增的数组方法做一个概述。首先,大多数方法的第一个参数接收一个函数,并且对数组的每个元素(或者一些元素)调用一次该函数。如果是稀疏数组,对不存在的元素不调用传递的函数。在大多数情况下,调用提供的函数使用3个参数:数组元素、数组元素的索引值和数组本身。通常,知需要第一个参数,可忽略后面2个参数。大多数ECMAScript 5数组方法的第一个参数是一个函数,第二个参数是可选的。如果有第二个参数,则第一个参数(被调用的函数)会被看做是第二个参数的方法。也就是说,第一个参数(被调用的函数)的this关键字指向的是第二个参数。被调用的函数的返回值非常重要,但是不同的方法处理返回值的方式也不一样。ECMAScript 5中的数组方法都不会修改原始数组本身,但是,方法所传递的调用函数是可以改变原始数组本身的。

forEach()
forEach()方法从头到尾遍历数组,为每个元素调用指定的函数。如上所述,调用的函数作为forEach()方法的第一个参数然后forEach()方法使用三个参数调用该函数:数组元素、数组元素的索引值和数组本身。如果你只关心数组元素的值,可编写只有一个参数的函数——额外的2个参数将被忽略:

1234567891011121314
;
arr.forEach(function(v){
    sum += v;});
console.log(sum);//15//每个元素的值自加1
arr.forEach(function(v, i, a){
    a;});
console.log(arr);//[2, 3, 4, 5, 6]

注意,forEach()方法无法在所有元素都传递给调用函数之前终止,也就是说,它始终都会遍历完,没有类似与for循环中的break语句。如果要提前终止,必须把forEach()方法放在一个try块中,并却抛出一个异常。如果forEach()方法抛出foreach.break异常,循环会提前终止。

map()
map()方法将调用数组的每个元素传递给指定函数,并返回一个数组,它包含该函数的返回值。例如:

12345
];var b = arr.map(function(x){return x * x;});
console.log(b)//[1, 4, 9, 16, 25]

传递给map()的函数的调用方式跟跟传递给forEach()的函数的调用方式一样。但是传递map()的函数应该有一个返回值。注意,map()安徽的是新数组,他不修改原始数组本身,如果袁术数组是稀疏数组,返回的数组也是稀疏数组:它具有相同的长度,相同的缺失元素。

filter()
filter()方法返回的数组元素是原始数组的一个子集。传递的函数是用来逻辑判断的:该函数返回true或者false。如果返回值为true或是能转化true的值,那么传递给判断函数的元素就是filter()返回的子集的成员,它将被添加到作为filter()方法的返回值的数组中,例如:

123456789
;});
console.log(b)//[4, 5]
console.log(c)//[1, 3, 5]

注意,filter()方法会跳过稀疏数组中的缺失元素,它返回的数组总是稠密的。我们可以利用这点来压缩稀疏数组中的空缺:

12345
];var b = arr.filter(function(){returntrue;});
console.log(b)//[1, 5]

甚至,压缩空缺并删除undefined和null元素,可以这样使用:

12345
];var b = arr.filter(function(x){return x !==undefined&& x !==null;});
console.log(b)//[1, 5]

every()和some()
every()和some()是数组的逻辑判断,它们对数组元素运用指定函数进行判定,返回一个布尔值。
every()方法就像数学中的“针对所有”的量词∀:当且仅当数组中所有元素调用判定函数都返回true时,every()方法才返回true,否则,返回false。
some()方法就像数学中的“存在”的量词∃:当数组中至少有一个元素调用判定函数返回true时,some()方法就返回true,当且仅当数组中所有元素调用判定函数都返回false时,some()方法才返回false。

1234567891011121314151617
;});
console.log(b)//true
console.log(c)//false
console.log(d)//false
console.log(e)//true

注意,一旦every()和some()确定该返回什么值,他们就回通知遍历数组。some()在判定函数第一次返回true的时候就返回true;但是如果判定函数一直返回false,它就会遍历整个数组。every()相反,在判定函数第一次返回false的时候就返回false;但是如果判定函数一直返回true,它就会遍历整个数组。根据数学逻辑,空数组调用时候,some()返回false,every()返回true。

reduce()和reduceRight()
reduce()和reduceRight()方法使用知道的函数将数组进行组合,生成单个值。这在函数式编程当中是非常常见的操作,也可以称之为“注入”和“折叠”。例如:

12345678910111213
);var d = arr.reduce(function(x, y){//求最大值return x > y ? x : y;});
console.log(b)//15
console.log(c)//120
console.log(d)//5

reduce()需要2个参数,第一个是执行简化操作的函数,简化函数的任务就是定义一个方法将两个值化简成一个值,并返回简化后的值。第2个(可选)参数是传递给简化函数的一个初始值。reduce()所使用的函数的第一个参数是目前位置简化操作的累计结果,如果是第一次调用,那么第一个参数是一个初始值,它是就是传递给reduce()函数的第2个参数,如果没有指定其初始值,它将使用数组的第一个元素作为初始值。这意味着在上面的求和和求积的例子中,也可以省略第二个参数(初始值参数)。

reduceRight()的工作原理和reduce()一样,不同的是它按照数组元素的索引值从高到低(从左到右)处理数组。如果简化操作是从左到右,你可能想使用它,例如:

1234
];var b = arr.reduceRight(function(x, y){//乘方操作,顺序为2^(3^4)returnMath.pow(y, x);});

indexOf()和lastIndexOf()
类似于string类型的indexOf()和lastIndexOf(),搜索整个数组中具有给定值的元素,如果找到,返回第一个找到的元素的索引,如果没有找到,返回-1。indexOf()从头到尾搜索,lastIndexOf()则相反。

123
var arr =['a','b','c','d','e'];
console.log(arr.indexOf('b'))//1
console.log(arr.lastIndexOf('e'))//4

ECMAScript 5中新增的数组方法的更多相关文章

  1. S5中新增的Array方法详细说明

      ES5中新增的Array方法详细说明 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wor ...

  2. ES5中新增的Array方法详细说明

    一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块,我们可能就不需要去有板有眼地for循环了. ES5中新增了写数组方法,如下: forEach (j ...

  3. iOS 判断数组array中是否包含元素a,取出a在array中的下标+数组方法详解

    目前找到来4个解决办法,第三个尤为简单方便 NSArray * arr = @["]; //是否包含 "]) { NSInteger index = [arr indexOfObj ...

  4. ES6中新增的数组知识

    JSON数组格式转换 JSON的数组格式就是为了前端快速的把JSON转换成数组的一种格式,我们先来看一下JSON的数组格式怎么写. let  json = {     '0': 'xzblogs', ...

  5. js中常用的数组方法

    在数组的尾部增加或删除某个元素:push() 和 pop() push() : 在数组的尾部追加一个或多个元素,并返回数组的长度 pop():在数组的尾部删除一个元素,并返回被删除项 var arr ...

  6. es6新增的数组方法和对象

    es6新增的遍历数组的方法,后面都会用这个方法来遍历数组,或者对象,还有set,map let arr=[1,2,3,4,3,2,1,2]; 遍历数组最简洁直接的方法法 for (let value ...

  7. HTML5自学笔记[ 4 ]js中新增的选择器方法

    querySelector():参数与jQuery一样,这个方法获取一组元素中的第一个元素. querySelectorAll():获取一组元素. getElementsByClassName():获 ...

  8. ECMAScript5中新增的Array方法实例详解

    ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.(注意兼容性) 在ES5中,一共有9个Array方法:http://kangax.githu ...

  9. ES6中新增的字符串方法

    实例方法:includes(), startsWith(), endsWith() 传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6 又提供 ...

随机推荐

  1. Github上传自己的工程

    1.注册并新建项目 2.配置github for windows 前题:安装相应的github for windows 2.1 获取密钥 可以用命令的模式(Git bash),参考资料中有相应的用法: ...

  2. PE格式的理解(待补充)

    PE文件格式 一.基本结构 1.DOS头一般到节区头成为PE头部分,其下称为PE体.文件的内容一般可分为代码(.text).数据(.data).资源(.rsrc),分别保存. 2.PE头与各节区的尾部 ...

  3. C字符串和C++中string的区别 &&&&C++中int型与string型互相转换

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:   C字符串 string对象(C++) 所需的头文件名称 ...

  4. Android开发环境搭建简介

    Android的开发工具,可以使用Eclipse,Idea,Android Studio,其中Eclipse是开源中国大部分使用的IDE,Idea是号称最好用的开发工具,有很多用处,Android S ...

  5. Week10(11月11日):一个激动的日子

    Part I:提问  =========================== 请回答视图和控制器传递数据的方法. Part II:案例学习 =========================== Mu ...

  6. 为什么MVC不是一种设计模式(转)

    MVC(Model-View-Controller)是处理界面应用程序时常用的解决方案,构成了表示层. MVC通过分离模型.视图.控制器在应用程序中的角色,实现界面和业务逻辑的解耦.Model(是OO ...

  7. 浅谈一下SSI+Oracle框架的整合搭建

    浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...

  8. IntelliJ Idea 14 安装 Golang 插件 google-go-lang-idea-plugin 的方法

    IDEA 的编辑器都很强悍,所以现在学Go 也想用他啊,无奈这个插件搞了好久,整理了下流程记录下 1. 当然是下载 IDEA 编辑器了 http://www.jetbrains.com/idea/do ...

  9. IOS开发中长按的手势事件编程

    长按手势事件: 长按按钮1S后改变按钮颜色: // 长按事件 #import "ViewController.h" @interface ViewController (){ UI ...

  10. CYQ.data 框架结构

    -------------------------V5.0开始(刚开始过滤版本:有些更新功能迁到V4,所以记录在V4那)-----------------------------7:Insert方法增 ...