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 相关文章推荐
ExtJS 2.0实用简明教程 之ExtJS版的Hello
Apr 29 Javascript
javascript 多级checkbox选择效果
Aug 20 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
Nov 07 Javascript
jQuery元素选择器用法实例
Dec 23 Javascript
JS给超链接加确认对话框的方法
Feb 24 Javascript
jquery实现简单手风琴菜单效果实例
Jun 13 Javascript
理解javascript中DOM事件
Dec 25 Javascript
AngularJS中$watch和$timeout的使用示例
Sep 20 Javascript
angularjs ocLazyLoad分步加载js文件实例
Jan 17 Javascript
微信小程序 支付功能(前端)的实现
May 24 Javascript
深入浅出webpack之externals的使用
Dec 04 Javascript
浅谈React和Redux的连接react-redux
Dec 04 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
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
python 获取本机ip地址的两个方法
2013/02/25 Python
tornado框架blog模块分析与使用
2013/11/21 Python
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
对Python发送带header的http请求方法详解
2019/01/02 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
使用Python发现隐藏的wifi
2020/03/04 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
师范生自荐信
2013/10/27 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
鸦片战争观后感
2015/06/09 职场文书