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 replace(rgExp,fn)正则替换的用法
Mar 04 Javascript
JavaScript 打地鼠游戏代码说明
Oct 12 Javascript
iframe里使用JavaScript控制主页转向的方法
Apr 03 Javascript
javascript实现手机震动API代码
Aug 05 Javascript
node.js微信公众平台开发教程
Mar 04 Javascript
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
May 20 Javascript
vue实现搜索功能
May 28 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
详细分析Node.js 多进程
Jun 22 Javascript
Js类的构建与继承案例详解
Sep 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
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
laravel自定义分页效果
2017/07/23 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
Javascript 遍历页面text控件详解
2014/01/06 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
纯JavaScript实现的分页插件实例
2015/07/14 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
Vue组件选项props实例详解
2017/08/18 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
Python实现图像的垂直投影示例
2020/01/17 Python
高山背包:High Sierra
2017/11/23 全球购物
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
2015年副班长工作总结
2015/05/15 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
导游词之塘栖古镇
2019/12/04 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL