ES6新特性二:Iterator(遍历器)和for-of循环详解


Posted in Javascript onApril 20, 2017

本文实例讲述了ES6新特性之Iterator(遍历器)和for-of循环。分享给大家供大家参考,具体如下:

1. 遍历数组

for-of工作原理:迭代器有一个next方法,for循环会不断调用这个iterator.next方法来获取下一个值,直到返回值中的 done属性为true的时候结束循环。

① 在ES6之前

var arr = [1,2,3,4,5,6];
arr.name = 'a';
for (var index = 0; index < arr.length; index++) {
  console.log(arr[index]);
}
arr.forEach(function (value) { //ES5 内建的forEach方法 缺陷:无法使用break 中断 ,也不能使用return 语句返回到外层函数
  console.log(value);
});

结果都是:1,2,3,4,5,6

② 用 for-in :作用于数组的 forfor -in 循环体除了遍历数组元素外,还会遍历自定义属性。比如数组有一个可枚举属性arr.a,循环将额外执行一次

for (var index in arr) { // 千万别这样做
 console.log(arr[index]);
}

结果:1,2,3,4,5,6,a

for-in 是为普通对象设计的,赋值给index的值不是实际的数字1、2,而是字符串‘1',‘2'

var b = 0;
for (var index in arr) {
 b = b+ index;
 console.log(b)
}

结果:00,001,0012,00123,001234,0012345,0012345name

③ 使用 for-of:避开了for-in 的所有缺陷,可以正确响应 break、return 语句

for(var value of arr){
  console.log(value)
}

结果:1,2,3,4,5,6

2.for-of 循环便利其他集合

① 遍历Set

var words = 'a';
var s = new Set();
s.add("a");
s.add(1);
for(var word of s){
  console.log(word);
}

结果:a,1

② 遍历Map

var map = new Map();
map.set('a',1);
map.set('b',2);
map.set('c',3);
map.set('d',4);
for(var [key,value] of map){
  console.log(key+':'+value);
}

结果:a:1,b:2,c:3,d:4

3. Iterator(遍历器)

① 遍历器(Iterator)是一种接口规格,任何对象只要部署这个接口,就可以完成遍历操作。它的作用有两个,一是为各种数据结构,提供一个统一的、简便的接口,二是使得对象的属性能够按某种次序排列。

② 遍历器的原理:遍历器提供了一个指针,指向当前对象的某个属性,使用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']);
console.log(it.next());//{ value: 'a', done: false }
console.log(it.next());//{ value: 'b', done: false }
console.log(it.next());//{ value: undefined, done: true }

③ Iterator接口返回的遍历器,原生具备next方法。

> 有三类数据结构原生具备Iterator接口:数组、类似数组的对象、Set和Map结构。

var map = new Map();
console.log(map[Symbol.iterator] === map.entries)//true
var arr = new Array();
console.log(arr[Symbol.iterator] === arr.values)//true
var set = new Set();
console.log(set[Symbol.iterator] === set.values)//true

> 其他数据结构(主要是对象)如果需要Iterator接口,都需要自己部署。

var students = {}
students[Symbol.iterator] = function() {
 let index = 1;
 return {
  next() {
   return {done: index>10, value: index++}
  }
 }
}
for(var i of students) {
 console.log(i);
}//

希望本文所述对大家ECMAScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery技巧之让任何组件都支持类似DOM的事件管理
Apr 05 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
May 25 Javascript
Angular 应用技巧总结
Sep 14 Javascript
JSON字符串和JSON对象相互转化实例详解
Jan 05 Javascript
react开发中如何使用require.ensure加载es6风格的组件
May 09 Javascript
微信小程序录音与播放录音功能
Dec 25 Javascript
详解一个基于套接字实现长连接的express
Mar 28 Javascript
函数式编程入门实践(一)
Apr 20 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 Javascript
js实现星星打分效果
Jul 05 Javascript
vue实现水波涟漪效果的点击反馈指令
May 31 Vue.js
Ajax实现异步加载数据
Nov 17 Javascript
微信小程序中form 表单提交和取值实例详解
Apr 20 #Javascript
ES6新特性一: let和const命令详解
Apr 20 #Javascript
javascript 正则表达式分组、断言详解
Apr 20 #Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
Apr 20 #jQuery
JS利用cookies设置每隔24小时弹出框
Apr 20 #Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
Apr 20 #Javascript
addEventListener()与removeEventListener()解析
Apr 20 #Javascript
You might like
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
一个PHP的QRcode类与大家分享
2011/11/13 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
在php7中MongoDB实现模糊查询的方法详解
2017/05/03 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
详解Python中for循环的使用
2015/04/14 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
基于opencv实现简单画板功能
2020/08/02 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
荷兰手表网站:Watch2Day
2018/07/02 全球购物
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
大课间体育活动方案
2014/03/12 职场文书
行政申诉状范文
2015/05/20 职场文书
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python