ES6入门教程之Iterator与for...of循环详解


Posted in Javascript onMay 17, 2017

本文主要介绍了关于ES6中Iterator与for...of循环的相关内容,分享出来供大家参考学习,需要的朋友们下面来一起看看详细的介绍:

一、Iterator(遍历器)

遍历器(Iterator)是一种协议,任何对象只要部署了这个协议,就可以完成遍历操作。在ES6中遍历操作特质for….of循环。

它的作用主要有两个:

  • 为遍历对象的属性提供统一的接口。
  • 使对象的属性能够按次序排列。

ES6的遍历器协议规定,部署了next方法的对象,就具备了遍历器功能。next方法必须返回一个包含value和done两个属性的对象。value属性是当前遍历的位置的值,而done属性是一个布尔值,用来表示遍历是否结束。

function makeIterator(array) {
  var nextIndex = 0;

  return {
   next: function() {
    return nextIndex < array.length ?
     {value: array[nextIndex++], done: false} :
     {value: undefined, done: true};
   }
  }
 }

 var it = makeIterator(['a', 'b']);
 it.next().value; //'a'
 it.next().value; //'b'
 it.next().done; // true

在上面代码片段中,定义了一个makeIterator函数,它的作用是返回一个遍历器对象,用来遍历参数数组。特别需要注意的是next返回值的构造。

下面,再看看一个遍历器的示例代码片段:

function idMaker() {
  var index = 0;
   return {
   next: function() {
    return {value: index++, done: false};
   }
   }
 }

 var it = idMaker();
 it.next().value; //'0'
 it.next().value; //'1'
 it.next().value; //'2'

二、for…of 循环

在ES6中,一个对象只要部署了next方法,就被视为是具有了iterator接口,就可以用for…of循环遍历它的值。

function idMaker() {
  var index = 0;
  return {
   next: function() {
    return {value: index++, done: false};
   }
  }
 }

 for (var n of it) {
  if (n > 5) {
   break;
   console.log( n );
  }
 }
 //0
 //1
 //2
 //3
 //4
 //5

上面的代码说明,for….of默认从0开始循环。

数组原生具备iterator接口

const arr = [1, 5, 3, 9];
 for (let v of arr) {
  console.log( v );
 }
 //1
 //5
 //3
 //9

相比较,Js原有的for…in循环,只能获得对象的键名,不能直接获取键值。ES6提供了for…of循环,允许遍历获取键值。

var arr = ['a', 'b', 'c', 'd'];

 for (a in arr) {
  console.log( a );
 }
 //0
 //1
 //2
 //3

 for (a of arr) {
  console.log( a );
 }
 //0
 //1
 //2
 //3

上面的代码片段表明,for…in循环读取键名,而for…of循环读取键值。

对于Set和Map结构的数据,可以直接使用for…of循环。

var name = ['S', 'D', 'J', 'Z', 'G', 'G', 'G'];
 for ( var e of name) {
  console.log( e );
 }
 //S
 //D
 //J
 //Z
 //G


 var es6 = new Map();
 es6.set('edition', 6);
 es6.set('committee', 'TC39');
 es6.set('standard', 'ECMA-262');
 for(var [name, value] of es6) {
   console.log(name + ": " + value);
 }
 // edition: 6
 // commttee: TC39
 // standard: ECMA-262

在上面的代码片段中,演示了如何遍历Set结构和Map结构,后者是同是遍历键名和键值。

对于普通的对象,for...of结构不能直接使用,否则则会报错。必须项部署iterator接口才能使用。但是,在这种情况下,for...in循环依然可以遍历键名。

var es6 = {
  name: "G.Dragon",
  year: 22,
  love: "coding"
 };

 for (e in es6) {
  console.log( e );
 }
 //name
 //year
 //love

 for( e of es6) {
  console.log( e );
 }
 // TypeError: es6 is not iterable

最后,总结一下。for...of循环可以使用的范围包括数组、类似数组的而对象(比如argument对象、DOM NodeList对象)、Set和Map结构、后文的Generator对象,以及字符串。下面是使用for...of循环遍历字符串和DOM NodeList对象的例子。

// 字符串例子
 let str = "hello";

 for (let s of str) {
  console.log( s );
 }
 //h
 //e
 //l
 //l
 //o

 // DOM NodeList对象的例子
 let paras = document.getSelectorAll("p");
 for (let p of paras) {
  p.classList.add("test");
 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript面向对象编程
Mar 02 Javascript
js函数使用技巧之 setTimeout(function(){},0)
Feb 09 Javascript
js工具方法弹出蒙版
May 08 Javascript
JS.elementGetStyle(element, style)应用示例
Sep 24 Javascript
jquery滚动到顶部底部代码
Apr 20 Javascript
js实现发送验证码后的倒计时功能
May 28 Javascript
jQuery实现的文字hover颜色渐变效果实例
Feb 20 Javascript
实例讲解jQuery中对事件的命名空间的运用
May 24 Javascript
Angular使用Md5加密的解决方法
Sep 16 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
Oct 01 Javascript
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
如何让vue长列表快速加载
Mar 29 Vue.js
angular.fromJson与toJson方法用法示例
May 17 #Javascript
Node.js编写CLI的实例详解
May 17 #Javascript
ES6入门教程之Class和Module详解
May 17 #Javascript
AngularJS实现动态添加Option的方法
May 17 #Javascript
AngularJS+bootstrap实现动态选择商品功能示例
May 17 #Javascript
Vue声明式渲染详解
May 17 #Javascript
node.js调用Chrome浏览器打开链接地址的方法
May 17 #Javascript
You might like
第六节 访问属性和方法 [6]
2006/10/09 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
关于svn冲突的解决方法
2013/06/21 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
vue 父组件中调用子组件函数的方法
2019/06/06 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
python执行外部程序的常用方法小结
2015/03/21 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
python 日志增量抓取实现方法
2018/04/28 Python
python 实现得到当前时间偏移day天后的日期方法
2018/12/31 Python
python retrying模块的使用方法详解
2019/09/25 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
eDreams巴西:廉价机票,酒店优惠和度假套餐
2017/04/14 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
数控专业毕业生求职信范文
2013/09/21 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
标准单位租车协议书
2014/09/23 职场文书
库房管理员岗位职责
2015/02/12 职场文书
2015年公司工作总结
2015/04/25 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android
Python list列表删除元素的4种方法
2021/11/01 Python
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
Android Studio 计算器开发
2022/05/20 Java/Android