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高级程序设计 阅读笔记(十八) js跨平台的事件
Aug 14 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
Javascript中typeof 用法小结
May 12 Javascript
js实现的星星评分功能函数
Dec 09 Javascript
ionic 上拉菜单(ActionSheet)实例代码
Jun 06 Javascript
jQuery.Ajax()的data参数类型详解
Jul 23 jQuery
ionic选择多张图片上传的示例代码
Oct 10 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
element-ui 时间选择器限制范围的实现(随动)
Jan 09 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 Javascript
vue-cli配置flexible过程详解
Jul 04 Javascript
使用JavaScript实现贪吃蛇游戏
Sep 29 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实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
2016/11/09 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
将python代码和注释分离的方法
2018/04/21 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Django重设Admin密码过程解析
2020/02/10 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
英文商务邀请函范文
2015/01/31 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
预备党员自我评价范文
2015/03/04 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
师范生小学见习总结
2015/06/23 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL
vue的项目如何打包上线
2022/04/13 Vue.js