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 相关文章推荐
用js实现控制内容的向上向下滚动效果
Jun 26 Javascript
jquery实现图片灯箱明暗的遮罩效果
Nov 15 Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 Javascript
JS模式之单例模式基本用法
Jun 30 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
简单易懂的天气插件(代码分享)
Feb 04 Javascript
Vue 2.0 服务端渲染入门介绍
Mar 29 Javascript
vue 实现类似淘宝星级评分的示例
Mar 01 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
vue动态注册组件实例代码详解
May 30 Javascript
layer弹出层显示在top顶层的方法
Sep 11 Javascript
解决Vue项目中tff报错的问题
Oct 21 Javascript
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
php如何调用webservice应用介绍
2012/11/24 PHP
php中error与exception的区别及应用
2014/07/28 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
js 浏览器事件介绍
2012/03/30 Javascript
jQuery.each使用详解
2015/07/07 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
浅谈js基础数据类型和引用类型,深浅拷贝问题,以及内存分配问题
2017/09/02 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
理解python中生成器用法
2017/12/20 Python
Django中间件实现拦截器的方法
2018/06/01 Python
Numpy的简单用法小结
2019/08/28 Python
python入门之基础语法学习笔记
2020/02/08 Python
Django中FilePathField字段的用法
2020/05/21 Python
python实现批处理文件
2020/07/28 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
linux面试题参考答案(10)
2013/11/04 面试题
日语专业个人的求职信
2013/12/03 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
幼儿教育感言
2014/02/05 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python