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按钮 请告诉我你最喜欢哪些?
Jan 08 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
Jul 25 Javascript
js闭包实现按秒计数
Apr 23 Javascript
jquery代码实现多选、不同分享功能
Jul 31 Javascript
jQuery为动态生成的select元素添加事件的方法
Aug 29 Javascript
js生成随机颜色方法代码分享(三种)
Dec 29 Javascript
求js数组的最大值和最小值的四种方法
Mar 03 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
Jun 20 Javascript
JS/CSS实现字符串单词首字母大写功能
Sep 03 Javascript
微信小程序激励式视频广告组件使用详解
Dec 06 Javascript
vant 时间选择器--开始时间和结束时间实例
Nov 04 Javascript
vue实现图片裁剪后上传
Dec 16 Vue.js
微信小程序中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
mysq GBKl乱码
2006/11/28 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
js自动下载文件到本地的实现代码
2013/04/28 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
2019/10/24 Javascript
对layui数据表格动态cols(字段)动态变化详解
2019/10/25 Javascript
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
Python中除法使用的注意事项
2014/08/21 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
详解django三种文件下载方式
2018/04/06 Python
anaconda如何查看并管理python环境
2019/07/05 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
写给妈妈的道歉信
2014/01/11 职场文书
大学生毕业求职自荐书范文
2014/02/04 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
华清池导游词
2015/02/02 职场文书
高中团支书竞选稿
2015/11/21 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
MYSQL 运算符总结
2021/11/11 MySQL
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript