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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 Javascript
js调用iframe实现打印页面内容的方法
Mar 04 Javascript
jQuery点缩略图弹出层显示大图片
Feb 13 Javascript
jquery图片切换实例分析
Apr 15 Javascript
javascript实现自动填写表单实例简析
Dec 02 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 Javascript
百度地图给map添加右键菜单(判断是否为marker)
Mar 04 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
May 17 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
Jan 11 Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
Dec 28 Javascript
详解js常用分割取字符串的方法
May 15 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
认识并使用PHP超级全局变量
2010/01/26 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
优化PHP代码技巧的小结
2013/06/02 PHP
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
Vue 自适应高度表格的实现方法
2020/05/13 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
Python守护进程用法实例分析
2015/06/04 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python中operator模块的操作符使用示例总结
2016/06/28 Python
Python实现动态图解析、合成与倒放
2018/01/18 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
设计毕业生简历中的自我评价
2013/10/01 职场文书
部队领导证婚词
2014/01/12 职场文书
婚礼新郎父母答谢词
2014/01/16 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL