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 相关文章推荐
ajax java 实现自动完成功能
Dec 19 Javascript
选择复选框按钮置灰否则按钮可用
May 22 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
Oct 17 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
angularjs自定义ng-model标签的属性
Jan 21 Javascript
jquery插件uploadify多图上传功能实现代码
Aug 12 Javascript
BootstrapTable加载按钮功能实例代码详解
Sep 22 Javascript
10分钟上手vue-cli 3.0 入门介绍
Apr 04 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
Aug 17 Javascript
vue slots 组件的组合/分发实例
Sep 06 Javascript
vue下载excel的实现代码后台用post方法
May 10 Javascript
150行代码带你实现微信小程序中的数据侦听
May 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
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
php中final关键字用法分析
2016/12/07 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
jQuery News Ticker 基于jQuery的即时新闻行情展示插件
2011/11/05 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
2020/02/15 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
我的求职择业计划书
2014/04/04 职场文书
英文请假条
2014/04/11 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
后勤工作个人总结
2015/02/28 职场文书
新闻通讯稿范文
2015/07/22 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
小程序实现侧滑删除功能
2022/06/25 Javascript