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 相关文章推荐
工作需要写的一个js拖拽组件
Jul 28 Javascript
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
Aug 06 Javascript
JavaScript实现搜索框的自动完成功能(一)
Feb 25 Javascript
微信小程序 form组件详解
Oct 25 Javascript
详解node.js搭建代理服务器请求数据
Apr 08 Javascript
javascript 产生随机数的几种方法总结
Sep 26 Javascript
angular-tree-component的使用详解
Jul 30 Javascript
node使用Mongoose类库实现简单的增删改查
Nov 08 Javascript
vue axios重复点击取消上一次请求封装的方法
Jun 19 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
May 20 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
关于PHP语言构造器介绍
2013/07/08 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
JQuery 简便实现页面元素数据验证功能
2007/03/24 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
微信小程序canvas实现签名功能
2021/01/19 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
python利用tkinter实现屏保
2019/07/30 Python
如何基于python测量代码运行时间
2019/12/25 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
会计专业个人自我鉴定
2014/03/21 职场文书
无私奉献演讲稿
2014/09/04 职场文书
公司给客户的感谢信
2015/01/23 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
交通事故起诉书
2015/05/19 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS