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类(纯JS, Ajax模式)
Mar 12 Javascript
JS定时刷新页面及跳转页面的方法
Jul 04 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
Jquery响应回车键直接提交表单操作代码
Jul 25 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
Jun 14 Javascript
Jquery删除css属性的简单方法
Dec 04 Javascript
微信小程序中添加客服按钮contact-button功能
Apr 27 Javascript
解决layui 三级联动下拉框更新时回显的问题
Sep 03 Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 Javascript
原生js实现碰撞检测
Mar 12 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 Javascript
关于JavaScript 中 if包含逗号表达式
Nov 27 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
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
Python使用chardet判断字符编码
2015/05/09 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
python opencv之分水岭算法示例
2018/02/24 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
2018/11/06 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Python求凸包及多边形面积教程
2020/04/12 Python
python能在浏览器能运行吗
2020/06/17 Python
python实现感知机模型的示例
2020/09/30 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
详解HTML5新增标签
2017/11/27 HTML / CSS
如何提高SQL Server的安全性
2016/07/25 面试题
2014迎新年晚会策划方案
2014/02/23 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
2019广播稿怎么写
2019/04/17 职场文书
CSS使用伪类控制边框长度的方法
2022/01/18 HTML / CSS