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 相关文章推荐
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
Jun 15 Javascript
js+css实现上下翻页相册代码分享
Aug 18 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
Dec 13 Javascript
jQuery表格插件datatables用法汇总
Mar 29 Javascript
JavaScript中return用法示例
Nov 29 Javascript
Javascript网页抢红包外挂实现分享
Jan 11 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
Jun 07 Javascript
vue实现的树形结构加多选框示例
Feb 02 Javascript
js笔试题-接收get请求参数
Jun 15 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
Sep 10 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
Jul 27 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 时间计算问题小结
2009/01/04 PHP
PHP开发中的错误收集,不定期更新。
2011/02/03 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
php简单获取复选框值的方法
2016/05/11 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
php写app用的框架整理
2019/09/29 PHP
用JQuery调用Session的实现代码
2010/10/29 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python学习数据结构实例代码
2015/05/11 Python
python检查指定文件是否存在的方法
2015/07/06 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Python AES加密实例解析
2018/01/18 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
python pandas生成时间列表
2019/06/29 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
什么是python的必选参数
2020/06/21 Python
python如何支持并发方法详解
2020/07/25 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
电子商务专业个人的自我评价
2013/12/19 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
法人授权委托书样本
2014/09/19 职场文书
三下乡个人总结
2015/03/04 职场文书
企业承诺书格式范文
2015/04/28 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang