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 相关文章推荐
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
尝试在让script的type属性等于text/html
Jan 15 Javascript
JS验证身份证有效性示例
Oct 11 Javascript
js switch case default 的用法示例介绍
Oct 23 Javascript
JS烟花背景效果实现方法
Mar 03 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
Jul 27 Javascript
angularjs学习笔记之双向数据绑定
Sep 26 Javascript
微信小程序实现简单input正则表达式验证功能示例
Nov 30 Javascript
js 数组详细操作方法及解析合集
Jun 01 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
Jul 17 Javascript
element-ui 上传图片后清空图片显示的实例
Sep 04 Javascript
vue中进行微博分享的实例讲解
Oct 14 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
css配合JavaScript实现tab标签切换效果
2018/10/11 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
2017/11/24 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
java程序员面试交流
2012/11/29 面试题
高中毕业典礼演讲稿
2014/09/09 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
vue3不同环境下实现配置代理
2022/05/25 Vue.js