📜  ES6-迭代器

📅  最后修改于: 2020-10-25 10:42:09             🧑  作者: Mango


迭代器简介

迭代器是一个对象,它使我们可以一次访问一个对象的集合。

以下内置类型默认情况下是可迭代的-

  • 数组
  • 地图

如果对象实现了键为[Symbol.iterator]并返回迭代器的函数,则该对象被视为迭代。 for … of循环可用于迭代集合。

下面的示例使用for..of循环声明数组,标记并对其进行迭代。


上面代码的输出如下:

10
20
30

下面的示例声明一个数组,标记并检索一个迭代器对象。 [Symbol.iterator]()可用于检索迭代器对象。迭代器的next()方法返回具有‘value’‘done’属性的对象。 ‘done’是布尔值,在读取集合中的所有项目后返回true。


上面代码的输出将如下所示-

{value: 10, done: false}
{value: 20, done: false}
{value: 30, done: false}
{value: undefined, done: true}

自定义可迭代

JavaScript中的某些类型是可迭代的(例如,数组,映射等),而其他类型则不是(例如,Eg类)。默认情况下不可迭代的JavaScript类型可以使用可迭代协议进行迭代。

下面的示例定义一个名为CustomerList的类,该类将多个客户对象存储为一个数组。每个客户对象都有firstName和lastName属性。

为了使此类可迭代,该类必须实现[Symbol.iterator]()函数。该函数返回一个迭代器对象。迭代器对象具有下一个返回对象{value:’customer’,done:true / false}的函数。


上面的代码输出如下:

{firstName: "Sachin", lastName: "Tendulkar"}
{firstName: "Rahul", lastName: "Dravid"}
{
   done: false
   value: {
      firstName: "Sachin",
      lastName: "Tendulkar"
   }
}
{
   done: false
   value: {
      firstName: "Rahul",
      lastName: "Dravid"
   }
}
{done: true}

发电机

在ES6之前,JavaScript中的函数遵循运行完成模型。 ES6引入了称为Generator的功能,该功能可以在中途停止,然后从停止的地方继续。

生成器在函数名称前添加星号*字符,并包含一个或多个yield语句。 yield关键字返回一个迭代器对象。

句法

function * generator_name() {
   yield value1
   ...
   yield valueN
}

该示例使用三个yield语句定义了生成器函数getMarks 。与普通函数不同,生成器函数getMarks()在被调用时不会执行该函数,而是返回一个迭代器对象,该对象可帮助您在生成器函数内部执行代码。

第一次调用markIter.next()时,将运行操作,并且yield语句会暂停生成器的执行。随后对markIter.next()的调用将恢复生成器函数,直到下一个yield表达式为止。


上面代码的输出将如下所述-

Step 1
{value: 10, done: false}
Step 2
{value: 20, done: false}
Step 3
{value: 30, done: false}
End of function
{value: undefined, done: true}

下面的示例创建一个无限的偶数序列,直到

* evenNumberGenerator生成器函数。

我们可以使用next()for for循环遍历所有偶数,如下所示


上面的代码输出如下:

{value: 2, done: false}
{value: 4, done: false}
2
4
6
8
10