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点击页面其它地方将某个显示的DIV隐藏
Jul 12 Javascript
jQuery表格插件ParamQuery简单使用方法示例
Dec 05 Javascript
jQuery中大家不太了解的几个方法
Mar 04 Javascript
jQuery解析json格式数据简单实例
Jan 22 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
微信小程序 Record API详解及实例代码
Sep 30 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
vue 点击按钮增加一行的方法
Sep 07 Javascript
利用JS响应式修改vue实现页面的input值
Sep 02 Javascript
Vue实现星级评价效果实例详解
Dec 30 Javascript
Javascript数组及类数组相关原理详解
Oct 29 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
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
destoon在360浏览器下出现用户被强行注销的解决方法
2014/06/26 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python可视化text()函数使用详解
2020/02/11 Python
python线程池如何使用
2020/05/28 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
python实现简单的学生管理系统
2021/02/22 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
商务邀请函范文
2014/01/14 职场文书
同事打架检讨书
2014/02/04 职场文书
预防煤气中毒方案
2014/06/16 职场文书
2014党员学习《反腐倡廉警示教育读本》思想汇报
2014/09/13 职场文书
计划生育诚信协议书
2014/11/02 职场文书
法院执行局工作总结
2015/08/11 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
解决golang结构体tag编译错误的问题
2021/05/02 Golang
SpringRetry重试框架的具体使用
2021/07/25 Java/Android