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 相关文章推荐
jQueryUI写一个调整分类的拖放效果实现代码
May 10 Javascript
AngularJS中的过滤器使用详解
Jun 16 Javascript
jQuery实现ctrl+enter(回车)提交表单
Oct 19 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 Javascript
jQuery ajax提交Form表单实例(附demo源码)
Apr 06 Javascript
简单实现的JQuery文本框水印插件
Jun 14 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
Sep 06 Javascript
AngularJS入门教程一:路由用法初探
May 27 Javascript
原生JS实现的雪花飘落动画效果
May 03 Javascript
理顺8个版本vue的区别(小结)
Sep 17 Javascript
react 兄弟组件如何调用对方的方法示例
Oct 23 Javascript
antd design table更改某行数据的样式操作
Oct 31 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
与数据库连接
2006/10/09 PHP
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
中止javascript执行的方法
2014/02/14 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
使用python实现滑动验证码功能
2019/08/05 Python
Python 中使用 PyMySQL模块操作数据库的方法
2019/11/10 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
人力资源行政经理自我评价
2013/10/23 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
绿色小区申报材料
2014/08/22 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
python脚本框架webpy的url映射详解
2021/11/20 Python
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL