时间:2021-05-28
本文实例讲述了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)//truevar arr = new Array();console.log(arr[Symbol.iterator] === arr.values)//truevar 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程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
ES6新的数组方法、集合、for-of循环、展开运算符(...)甚至异步编程都依赖于迭代器(Iterator)实现。本文会详解ES6的迭代器与生成器,并进一步挖
本文实例讲述了ES6中Iterator与for..of..遍历用法。分享给大家供大家参考,具体如下:Iterator与for..of..遍历1.Iterator
目前各大浏览器基本上都支持ES6的新特性,其中Chrome和Firefox浏览器对ES6新特性最友好,IE7~11基本不支持ES6。以下是各大浏览器支持情况及开
edge支持es6,Edge15可以支持96%的ES6新特性。Edge14可以支持93%的ES6新特性。 2015年4月30日,微软在旧金山举行的Build2
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于i