本文实例讲述了ES6 Iterator遍历器原理,应用场景及相关常用知识拓展。分享给大家供大家参考,具体如下:
介绍Iterator之前先列举下js的表示数据集合结构的几种方式:
在es6之前有 Array , Object, es6新增了 map, set,当然用户也可以组合使用这几种数据结构,灵活存储数据。
但是当数据结构变得复杂后,怎样取到里面的数据就也相对复杂,这就需要有一种读取数据的统一的接口机制,来处理不同的数据结构。
遍历器就是这样一种接口机制,Iterator是一种接口,为不同数据结构提供统一的接口机制。
相应的任何数据结构只要部署Iterator接口,就可以完成遍历操作。
Iterator的作用:
1,为各种数据结构提供一种统一的,简单的访问接口;
2,使得数据结构的成员能够按照某种次序排列;
3,ES6提供了一种新的遍历循环(for......of.....),Iterator被for......of.....循环调用;
Iterator本质:
遍历器本质上是一种指针对象,指针对象上有next()方法,第几次调用就指向第几个成员
Iterator上next()方法调用返回:
1,返回当前成员的信息
2,返回遍历是否结束
模拟实现Iterator
var it = makeIterator(['a', 'b']); it.next() // { value: "a", done: false } it.next() // { value: "b", done: false } it.next() // { value: undefined, done: true } function makeIterator(array) { var nextIndex = 0; return { next: function() { return nextIndex < array.length "htmlcode">interface Iterable { [Symbol.iterator]() : Iterator, } interface Iterator { next(value"t5">关于默认的Iterator接口:ES6 规定,默认的 Iterator 接口部署在数据结构的
Symbol.iterator
属性,或者说,一个数据结构只要具有Symbol.iterator
属性,就可以认为是“可遍历的”(iterable)。Symbol.iterator的本质:
1,Symbol.iterator本身是一个函数,对应当前数据结构默认的遍历器生成函数;
2,执行Symbol.iterator这个函数会返回一个遍历器。
实例:
const obj = { [Symbol.iterator] : function () { return { next: function () { return { value: 1, done: true }; } }; } }; //这样定义后对象就有了Iterator接口 //执行对象obj的symbol.iterator后,返回一个遍历器具有原生iterator的数据结构:
Array , Map, Set, String, TypedArray, 函数的argulements对象,NodeList对象(节点对象);
数组iterator实例
let arr = ['a', 'b', 'c']; let iter = arr[Symbol.iterator](); iter.next() // { value: 'a', done: false } iter.next() // { value: 'b', done: false } iter.next() // { value: 'c', done: false } iter.next() // { value: undefined, done: true }对象iterator接口实现
class RangeIterator { constructor(start, stop) { this.value = start; this.stop = stop; } [Symbol.iterator]() { return this; } next() { var value = this.value; if (value < this.stop) { this.value++; return {done: false, value: value}; } return {done: true, value: undefined}; } } function range(start, stop) { return new RangeIterator(start, stop); } for (var value of range(0, 3)) { console.log(value); // 0, 1, 2 }注意:如果一个对象没有iterator接口,而其原型链上有Iterator接口,也可以通过继承而拥有该接口;
使用
while
循环遍历var $iterator = ITERABLE[Symbol.iterator](); var $result = $iterator.next(); while (!$result.done) { var x = $result.value; // ... $result = $iterator.next(); }基本概念基本就是这些,接下来看下使用场景
Iterator的使用场景:
默认调用场景:
for....of...循环, 解构赋值, 扩展运算符, yield*关键字
ES6 借鉴 C++、Java、C# 和 Python 语言,引入了
for...of
循环,作为遍历所有数据结构的统一的方法这里主要介绍下yield*,其余几个都比较好理解
yield*
后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口let generator = function* () { yield 1; yield* [2,3,4];//执行时默认遍历数组 yield 5; }; var iterator = generator(); iterator.next() // { value: 1, done: false } iterator.next() // { value: 2, done: false } iterator.next() // { value: 3, done: false } iterator.next() // { value: 4, done: false } iterator.next() // { value: 5, done: false } iterator.next() // { value: undefined, done: true }其他场景:
由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用了遍历器接口
- for...of
- Array.from()
- Map(), Set(), WeakMap(), WeakSet()(比如
new Map([['a',1],['b',2]])
)- Promise.all()
- Promise.race()
知识拓展:
遍历器对象的 return(),throw()
return方法在循环退出或者报错时调用
throw
方法主要是配合 Generator 函数使用(详见generator)计算生成的数据结构
在原有数据结构基础上计算生成的数据结构,例如Object,Map,Set,Array的entries(),keys(), value()方法生成的数据结构,默认具有iterator接口
类似数组对象
常见:字符串,NodeList节点对象,参数arguments
1,并不是所有类似数组的对象都具有 Iterator 接口
2,对于类数组对象可以通过Array.From()将类数组对象转化为数组对象
3,for-of可以识别32 位 UTF-16 字符
for (let x of 'a\uD83D\uDC0A') { console.log(x); }for-of和其他遍历方法对比:
for循环,forEach循环,for...in...循环
forEach循环无法中途跳出
for...in
循环有几个缺点(for...in
循环主要是为遍历对象而设计的,不适用于遍历数组),
- 数组的键名是数字,但是
for...in
循环是以字符串作为键名“0”、“1”、“2”等等。for...in
循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。- 某些情况下,
for...in
循环会以任意顺序遍历键名。对于for...of...
- 有着同
for...in
一样的简洁语法,但是没有for...in
那些缺点。- 不同于
forEach
方法,它可以与break
、continue
和return
配合使用。- 提供了遍历所有数据结构的统一操作接口。
参考:http://es6.ruanyifeng.com/
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]