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 IE和FF兼容性问题汇总
Feb 09 Javascript
document.documentElement的一些使用技巧
Apr 18 Javascript
浅谈js中的闭包
Mar 16 Javascript
js+html5绘制图片到canvas的方法
Jun 05 Javascript
jQuery事件绑定on()与弹窗实现代码
Apr 28 Javascript
AngularJs Dependency Injection(DI,依赖注入)
Sep 02 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
jQuery中on方法使用注意事项详解
Feb 15 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
Mar 02 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
May 06 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
基于mysql的bbs设计(二)
2006/10/09 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
功能强大的php分页函数
2016/07/20 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
JS实现网页时钟特效
2020/03/25 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python读取Android permission文件
2013/11/01 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
python实现图片批量压缩程序
2018/07/23 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
优秀团员个人事迹材料
2014/01/29 职场文书
师范生自我鉴定
2014/03/20 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
小学生期末评语大全
2014/04/21 职场文书
毕业论文评语大全
2014/04/29 职场文书
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android