JavaScript之iterable_动力节点Java学院整理

遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。

具有iterable类型的集合可以通过新的for ... of循环来遍历。

for ... of循环是ES6引入的新的语法,请测试你的浏览器是否支持:

'use strict';
var a = [1, 2, 3];
for (var x of a) {
}
alert('你的浏览器支持for ... of');

for ... of循环遍历集合,用法如下:

var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
  alert(x);
}
for (var x of s) { // 遍历Set
  alert(x);
}
for (var x of m) { // 遍历Map
  alert(x[0] + '=' + x[1]);
}

你可能会有疑问,for ... of循环和for ... in循环有何区别?

for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。

当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
  alert(x); // '0', '1', '2', 'name'
}
for ... in循环将把name包括在内,但Array的length属性却不包括在内。
for ... of循环则完全修复了这些问题,它只循环集合本身的元素:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
  alert(x); // 'A', 'B', 'C'
}

这就是为什么要引入新的for ... of循环。

然而,更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。以Array为例:

var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
  // element: 指向当前元素的值
  // index: 指向当前索引
  // array: 指向Array对象本身
  alert(element);
});

注意,forEach()方法是ES5.1标准引入的,你需要测试浏览器是否支持。

SetArray类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:

var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
  alert(element);
});

Map的回调函数参数依次为valuekeymap本身:

var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
  alert(value);
});

如果对某些参数不感兴趣,由于JavaScript的函数调用不要求参数必须一致,因此可以忽略它们。例如,只需要获得Arrayelement

var a = ['A', 'B', 'C'];
a.forEach(function (element) {
  alert(element);
});
(0)

相关推荐

  • java集合_浅谈Iterable和Iterator的区别

    1). Iterator是迭代器类,而Iterable是为了只要实现该接口就可以使用foreach,进行迭代. 2). Iterable中封装了Iterator接口,只要实现了Iterable接口的类,就可以使用Iterator迭代器了. 3). 集合Collection.List.Set都是Iterable的实现类,所以他们及其他们的子类都可以使用foreach进行迭代. 4). Iterator中和核心的方法next(),hasnext(),remove(),都是依赖当前位置,如果这些集合直

  • Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法

    Python 出现错误TypeError: 'NoneType' object is not iterable解决办法 TypeError: 'NoneType' object is not iterable  这个错误提示一般发生在将None赋给多个值时. def myprocess(): a == b if a != b: return True, value; flag, val = myprocess() 在判断语句中,当if条件不满足,并且没有else语句时,函数默认返回None. 在

  • JavaScript之iterable_动力节点Java学院整理

    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Set都属于iterable类型. 具有iterable类型的集合可以通过新的for ... of循环来遍历. for ... of循环是ES6引入的新的语法,请测试你的浏览器是否支持: 'use strict'; var a = [1, 2, 3]; for (var x of a) { } alert('你的浏览器支持for ... of'); 用

  • JavaScript之DOM_动力节点Java学院整理

    由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM. 始终记住DOM是一个树形结构.操作一个DOM节点实际上就是这么几个操作: 更新:更新该DOM节点的内容,相当于更新了该DOM节点表示的HTML的内容: 遍历:遍历该DOM节点下的子节点,以便进行进一步操作: 添加:在该DOM节点下新增一个子节点,相当于动态增加了一个HTML节点: 删除:将该节点从HTML中删除,相当于删掉了该DOM节点的内容以及它包含的所有子节点. 在操作一个DO

  • JavaScript之json_动力节点Java学院整理

    JSON是JavaScript Object Notation的缩写,它是一种数据交换格式. 在JSON出现之前,大家一直用XML来传递数据.因为XML是一种纯文本格式,所以它适合在网络上交换数据.XML本身不算复杂,但是,加上DTD.XSD.XPath.XSLT等一大堆复杂的规范以后,任何正常的软件开发人员碰到XML都会感觉头大了,最后大家发现,即使你努力钻研几个月,也未必搞得清楚XML的规范. 终于,在2002年的一天,道格拉斯·克罗克福特(Douglas Crockford)同学为了拯救深

  • JavaScript简介_动力节点Java学院整理

    JavaScript是一种基于对象(Object)和事件驱动(EventDriven)并具有安全性能的脚本语言.使用它的目的是与HTML超文本标记语言实现在一个Web页面中连接多个对象,与Web客户交互作用.javascript的出现使得网页和用户之间实现了一种实时性的,动态性的,交互性的关系,使网页包含更多活跃的元素和更加精彩的内容. 同时javascript短小精悍,在客户机上执行,大大提高了网页的浏览速度和交互能力. 再者,我们看一下javascript的特点: 1,JavaScript是

  • JavaScript标准对象_动力节点Java学院整理

    在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对象的类型,它总是返回一个字符串: typeof 123; // 'number' typeof NaN; // 'number' typeof 'str'; // 'string' typeof true; // 'boolean' typeof undefined; // 'undefined' typeof Math.abs; // 'function' ty

  • JavaScript闭包_动力节点Java学院整理

    函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个对Array的求和.通常情况下,求和的函数是这样定义的: function sum(arr) { return arr.reduce(function (x, y) { return x + y; }); } sum([1, 2, 3, 4, 5]); // 15 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数! function lazy

  • JavaScript创建对象_动力节点Java学院整理

    JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象. 当我们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找,如果还没有找到,就一直上溯到Object.prototype对象,最后,如果还没有找到,就只能返回undefined. 例如,创建一个Array对象: var arr = [1, 2, 3]; 其原型链是: arr ----> Array.prototype ----> Object.proto

  • JavaScript之underscore_动力节点Java学院整理

    JavaScript是函数式编程语言,支持高阶函数和闭包.函数式编程非常强大,可以写出非常简洁的代码.例如Array的map()和filter()方法: 'use strict'; var a1 = [1, 4, 9, 16]; var a2 = a1.map(Math.sqrt); // [1, 2, 3, 4] var a3 = a2.filter((x) => { return x % 2 === 0; }); // [2, 4] 现在问题来了,Array有map()和filter()方法

  • JavaScript之Date_动力节点Java学院整理

    在JavaScript中,Date对象用来表示日期和时间. 要获取系统当前时间,用: var now = new Date(); now; // Wed Jun 24 2015 19:49:22 GMT+0800 (CST) now.getFullYear(); // 2015, 年份 now.getMonth(); // 5, 月份,注意月份范围是0~11,5表示六月 now.getDate(); // 24, 表示24号 now.getDay(); // 3, 表示星期三 now.getHo

  • JavaScript之RegExp_动力节点Java学院整理

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它"匹配"了,否则,该字符串就是不合法的. 所以我们判断一个字符串是否是合法的Email的方法是: 1.创建一个匹配Email的正则表达

随机推荐