Javascript ES6 Iterators建议指南(含实例)
来源:前端全栈开发学习     阅读:551
牛牛兔源码
发布于 2018-11-13 23:38
查看主页

由Arfat Salman发布

本文旨在分析了解 Iterators 。 Iterators 是 JavaScript 中的新方法,可以用来循环任意集合。在ES6中登场的Iterators。因其可被广泛使用,并且已在多处场景派上用场,现已十分流行。

我们从概念上去了解iterators,通过实例讲述在何处使用。并且. We’ll also see some of its implementations in JavaScript.

详情

假如你有下面的数组 ——

const myFavouriteAuthors = [  'Neal Stephenson',  'Arthur Clarke',  'Isaac Asimov',   'Robert Heinlein'];

有时,你需要获取这个数组中每一个值,在屏幕上显示它们,操作它们,或者者依据它们做些事情。假如我问你将如何解决?你会说,这很简单——我循环它们就是了,可以用for__, while__, for-of 或者者 这些 循环方法中的任意一个。

各种循环数组的方法

假如现在不是前面的数组,而是以自定的数据结构保存所有的authors,比方——

自定数据结构

现在, myFavouriteAuthors 是一个包含了对象 allAuthors 的对象, allAuthors 包含了三个数组,对应key值为 fiction , scienceFiction ,和 fantasy现在假如需要遍历 myFavouriteAuthors 来获取所有的作者, 你的方法是什么? 你可以继续尝试少量循环组合来获取所有数据。

然而,假如你这样做 —

for (let author of myFavouriteAuthors) {   console.log(author)}// TypeError: {} is not iterable</pre>

你会得到一个该对象不是_可迭代的_TypeError。 我们来看看迭代是什么,以及我们如何使对象可迭代。 在本文的最后,你将知道如何在这种情况下,在 myFavouriteAuthors 上,在自己设置对象上使用 for-of 循环。

Iterables(可迭代对象) and Iterators(迭代器)

在上一节中看到了问题所在。 没有方法可以简单得从我们的自己设置对象中获取所有作者。 我们想要一种方法,通过它我们可以有序地呈现所有内部数据。

让我们在 myFavouriteAuthors 中增加一个返回所有作者的方法 getAllAuthors 。 像这样 ——

getAllAuthors 的实现

这是一个简单的方法。 它完成了取得所有作者的当下目标。 但是,这种实现可能会出现少量问题。 比方——

[ {name: 'Agatha Christie'}, {name: 'J. K. Rowling'}, ... ]</pre>

开发人员必需知道,返回所有数据的方法的 确切名称和返回类型

假如我们制定一个 规则 ,该方法的 名称 及其 返回类型是固定且不可更改的 ,这怎样办?

让我们将这个方法命名为—— **iteratorMethod **.

ECMA 采取了相似的步骤,来标准化循环自己设置对象的过程。但是,ECMA使用 Symbol.iterator 而不是 iteratorMethod 。 Symbols 提供唯一且不能与其余属性名称冲突的名称。 此外, Symbol.iterator 将返回一个名为 iterator 的对象。 这个迭代器将有一个名为 next 的方法,它将返回一个包含key为 valuedone 对象,

key value 中将包含当前值。 它可以是任何类型。 done 是布尔值。 它表示能否已获取所有值。

下图可能有助于建立 _ iterables __ iterators __ next _ 之间的关系。 这种关系称为迭代协议。

iterables, iterators, 和 next之间的关系。

参考 Axel Rauschmayer博士 的 Exploring JS 一书 —

使对象可迭代

正如我们在上一节中所学到的,我们需要实现一个名为 Symbol.iterator 的方法。我们将使用 computed property syntax 来设置这个key。举一个简短的例子 —

可迭代的示例

在第4行,我们创立iterator。 这是一个定义了 next 方法的对象。 next 方法根据 step 变量返回对应的值。 在第25行,我们取到 iterator 。 27行,我们调用 next 方法。 接下来我们继续调用,直到 done 变成'true`。

这正是 for-of 循环中发生的事情。 for-of 循环采用 **iterable **,并为其创立 _ iterator_ 。 不断调用 next() 直到 done 为真。

JavaScript中的 Iterables

很多东西在JavaScript中都是可迭代的。 它可能不是立等可见的,但假如仔细观察,是能看到iterables的。

这些都是可迭代的 ——

其余在JS中使用iterables的 ——

for (const value of iterable) { ... }</pre>

代码:

const array = ['a', 'b', 'c', 'd', 'e'];const [first, ,third, ,last] = array;</pre>

相当于

const array = ['a', 'b', 'c', 'd', 'e'];const iterator = array[Symbol.iterator]();const first = iterator.next().valueiterator.next().value // Since it was skipped, so it's not assignedconst third = iterator.next().valueiterator.next().value // Since it was skipped, so it's not assignedconst last = iterator.next().value</pre>

代码:

const array = ['a', 'b', 'c', 'd', 'e'];const newArray = [1, ...array, 2, 3];</pre>

可以写成

const array = ['a', 'b', 'c', 'd', 'e'];const iterator = array[Symbol.iterator]();const newArray = [1];for (let nextValue = iterator.next();nextValue.done !== true;nextValue = iterator.next()) {  newArray.push(nextValue.value);}newArray.push(2)newArray.push(3)

Map的构造函数将 [key,value] 形式的迭代器转换为Map,Set的构造函数将可迭代的元素转换为Set——

const map = new Map([[1, 'one'], [2, 'two']]);map.get(1) // oneconst set = new Set(['a', 'b', 'c]);set.has('c');// true

让myFavouriteAuthors可迭代

这是一个使myFavouriteAuthors可迭代的实现方式。

可迭代的实现示例

根据本文的详情,您可以轻松理解迭代器的工作方式。 可能有点难以了解它的逻辑,所以,我已经为代码写了注释。 但是,吸收和了解概念的最佳方法是让这些代码在浏览器或者node中运行起来。

如有疑问,欢迎回复! 参考:

免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 服务器应用
相关推荐
美团Android面经六道轮回之旅
web前台入门到实战:js刷新当前页面的5种方式
阿里云ECS关闭删除阿里云盾(安骑士)方法收集汇总
前台面试每日 3+1 —— 第348天
前台开发者手册2019
首页
搜索
订单
购物车
我的