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 相关文章推荐
JavaScript 验证码的实例代码(附效果图)
Mar 22 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
Apr 15 Javascript
JavaScript匿名函数与委托使用示例
Jul 22 Javascript
jQuery基于ajax实现星星评论代码
Aug 07 Javascript
jquery及js实现动态加载js文件的方法
Jan 21 Javascript
基于javascript实现按圆形排列DIV元素(一)
Dec 02 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
Vuex之理解Store的用法
Apr 19 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
Jan 07 Javascript
使用Vue 实现滑动验证码功能
Jun 27 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
Aug 22 Javascript
nuxt 实现在其它js文件中使用store的方式
Nov 05 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.MVC的模板标签系统(一)
2006/09/05 PHP
PHP版自动生成文章摘要
2008/07/23 PHP
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
php格式化电话号码的方法
2015/04/24 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
javascript之AJAX框架使用说明
2010/04/24 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
JS数学函数Exp使用说明
2012/08/09 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Python单元测试简单示例
2018/07/03 Python
django框架自定义用户表操作示例
2018/08/07 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
Python对HTML转义字符进行反转义的实现方法
2019/04/28 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
分享一个pycharm专业版安装的永久使用方法
2019/09/24 Python
Python和Sublime整合过程图示
2019/12/25 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
小学语文复习计划
2015/01/19 职场文书
Python加密技术之RSA加密解密的实现
2022/04/08 Python