SE5之前我们可以用for循环来遍历数组,SE5为数组引进了新的方法forEach(),方便了很多,但是该方法不能够通过break或者return返回外层函数。

arr.forEach(function(value){
console.log(value);
})

ES6定义了一个更好的遍历数组的方法for-of循环,该方法的强大在于可以遍历任何具有迭代器的对象,例如数组、NodeList对象、Map和Set对象。还可用于遍历字符串,将其视为一系列的Unicode字符来遍历,即中文也算一个字符。

遍历数组

function outputArr(var arr){
for( var tmp of arr){
console.log(tmp);
}
}

遍历NodeList

(function(){
let divArr = document.getElementsByName('div');
for(let tmp of divArr){
tmp.style.color = 'red';
}
})();

遍历Set

var set = new Set(array);
for( var arr of set){
console.log(arr);
}

遍历Map,需要用到SE6解构的方法。

var map = new Map();
map.set("aa",1);
map.set("bb",2);
for(var [name, value] of map){
console.log(name +" " + value);
}

遍历字符串

var str = "abc哈哈";
for(var tmp of str){
console.log(tmp);
}
// a
// b
// c
// 哈
// 哈

深入理解迭代器对象

for-of循环首先调用集合的[Symbol.iterator]()方法,该方法返回一个新的迭代器对象,如自身,但该对象要具有一个.next()方法。for每循环一次就调用这个.next()方法。该方法返回一个对象{done:false,value:value},done属性用来判断循环是否结束,value属性就是迭代的值。最简单的例子如下。

function ite(){
var index = 0;
return {
[Symbol.iterator]: function () {
return this;
},
next:function(){
return index < 3 ? {done:false,value:index++}:{done:true,value:undefined};
}
}
}
(function(){
var it = ite();
for(var tmp of it){
console.log(tmp);
}
}())

注意:迭代器对象一定要有有Symbol.iterator和next这两个方法,不然会判断这不是一个迭代器,Symbol是SE6的新类型,该类型的值是与任何值都不同,用来避免重名的问题。火狐运行结果0,1,2。

迭代器还有可选的.return()和.throw(exc)方法。如果for-of循环过早退出会调用.return()方法,如用异常、return、break触发.return()方法。所以.return()方法可以用来处理一些释放内存或资源的工作,而对于.throw()方法,for-of循环永远不会调用它。

这两个方法通常用来处理生成器,在讲生成器的时候会由具体说明。

ES6 for-of循环和迭代器使用细节的更多相关文章

  1. ES6入门十:iterator迭代器

    迭代模式 ES6迭代器标准化接口 迭代循环 自定义迭代器 迭代器消耗 一.迭代模式 迭代模式中,通常有一个包含某种数据集合的对象.该数据可能存在一个复杂数据结构内部,而要提供一种简单的方法能够访问数据 ...

  2. 如何正确遍历删除List中的元素(普通for循环、增强for循环、迭代器iterator、removeIf+方法引用)

    遍历删除List中符合条件的元素主要有以下几种方法: 普通for循环 增强for循环 foreach 迭代器iterator removeIf 和 方法引用 其中使用普通for循环容易造成遗漏元素的问 ...

  3. 深入浅出ES6(二):迭代器和for-of循环

    作者 Jason Orendorff  github主页  https://github.com/jorendorff 我们如何遍历数组中的元素?20年前JavaScript刚萌生时,你可能这样实现数 ...

  4. es6学习笔记一:迭代器和for-of循环

    我们如何遍历一个数组呢?在20年前,我们是这样遍历一个数组的: var myArr = []; for (var i = 0; i < arr.length; i++) { console.lo ...

  5. ES6 for of循环, 可迭代接口,实现可迭代接口

    在for of循环出现之前,for循环适合遍历普通的数组,for in循环比较适合遍历键值对,遍历数组对象的foreach方法,但是这些遍历 都有一定的局限性,所以在ES6之后引入了统一的遍历方式 f ...

  6. 15.python的for循环与迭代器、生成器

    在前面学习讲完while循环之后,现在终于要将for循环这个坑填上了.之所以拖到现在是因为for循环对前面讲过的序列.字典.集合都是有效的,讲完前面的内容再来讲for循环会更加容易上手. 首先,for ...

  7. es6 for of 循环

    es6 新增了 for of 循环,只要继承了Iterator 接口的数据集合都可以使用 for of 去循环 for of 循环,统一数据集合的循环方法,解决了forEach循环的不能使用break ...

  8. python - 条件语句/循环语句/迭代器

    条件测试:if 条件表达式python 的比较操作        所有的python对象都支持比较操作            可用于测试相等性.相对大小等            如果是复合对象,pyt ...

  9. 程序控制结构及for循环、foreach循环、迭代器

    结构化程序设计 三种基本控制结构:顺序结构.选择结构.循环结构. 在这种思想的指导下,发展出了面向过程编程方式.面向过程编程的核心是算法+数据结构.算法可以用顺序.选择.循环这三种基本控制结构来实现. ...

随机推荐

  1. JavaWeb学习之JDBC API中常用的接口和类

    JDBC API中包含四个常用的接口和一个类分别是: 1.Connection接口 2.Statement接口 3.PreparedStatement接口 4.ResultSet接口 5.Driver ...

  2. 关于memcached的那些事儿

    一.前言 目前,memcached + mysql的这种存储组合,被广泛地应用到“读多写少”的应用场景上.那么在使用memcached的时候,我们需要注意哪些问题呢? 下面我们来探讨下使用memcac ...

  3. flex布局常用属性

    最近喜欢flex布局,它可以完美的实现响应式布局,下边我总结了它的一些常用属性,喜欢的,也可以练习写一下,很好用~~~ 注意:使用了flex布局,对于子元素的float.clear和vertical- ...

  4. PHP多进程编程pcntl_fork解

    其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全也可以使用PHP来进行系统工具类的编程,做监控或 ...

  5. JAVA设计模式总结之六大设计原则

    从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...

  6. mybatis 架构

    官网地址:http://code.google.com/p/mybatis/ 版本:mybatis 3.2.3 生成工具:mybatis-generator-core-1.3.2-bundle.zip ...

  7. python GUI实战项目——tkinter库的简单实例

    一.项目说明: 本次通过实现一个小的功能模块对Python GUI进行实践学习.项目来源于软件制造工程的作业.记录在这里以复习下思路和总结编码过程.所有的源代码和文件放在这里: 链接: https:/ ...

  8. Windows开启telnet服务 + 连接失败处理

    一.控制面板中安装Telnet相关组件 单击"开始"菜单,单击"控制面板"     在控制面板中单击打开"程序和功能"项目   在左侧的蓝色 ...

  9. IDL 存储数组

    IDL中的数组在内存中是按行存储的,这是因为IDL最初设计的设计目的是用来处理行扫描卫星数据. 1.一维数组 m个元素的一维数组arr[m]的存储方式为 arr[0]→arr[1]→...→arr[m ...

  10. linux udev、mdev 介绍

    Udev介绍 Udev的下载网址:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/ Udev分为三个子计划:namedev,libs ...