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 相关文章推荐
jquery蒙版控件实现代码
Dec 08 Javascript
AngularJS快速入门
Apr 02 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
ECharts仪表盘实例代码(附源码下载)
Feb 18 Javascript
jQuery下拉框的简单应用
Jun 24 Javascript
JavaScript性能优化总结之加载与执行
Aug 11 Javascript
AngularJS动态加载模块和依赖的方法分析
Nov 08 Javascript
浅析js的模块化编写 require.js
Dec 07 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
May 22 Javascript
Vue实现简易翻页效果源码分享
Nov 08 Javascript
JS实现放大镜效果
Sep 21 Javascript
js实现星星海特效的示例
Sep 28 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 引用是个坏习惯
2010/03/12 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
使用jquery.validate自定义方法实现&quot;手机号码或者固话至少填写一个&quot;的逻辑验证
2014/09/01 Javascript
jquery 实现两Select 标签项互调示例代码
2014/09/25 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
2019/02/21 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
python程序 创建多线程过程详解
2019/09/23 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
学校献爱心活动总结
2014/07/08 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
培训通知
2015/04/17 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
2015年库房工作总结
2015/04/30 职场文书
导游词之青岛崂山
2019/12/27 职场文书
Windows Server 2012 R2 磁盘分区教程
2022/04/29 Servers