ES6 中的 iterator 和 generator 的用法

阅读时长 7 分钟读完

前言

在 ES6 中,Iterator 和 Generator 是两个比较重要的特性。Iterator 用于遍历集合中的元素,而 Generator 则可以产生一系列值。它们不仅在语法上大大简化了开发者的代码,还使得开发者能够更好地使用 JavaScript。

Iterator

Iterator 是一个统一的遍历集合的接口。它可以让开发者遍历任何类型的数据结构,方法是将数据结构转换成 Iterator 对象。Iterator 对象包含一个 next() 方法,每次调用 next() 方法都会返回一个包含 value 和 done 两个属性的对象,value 表示当前遍历到的值,done 表示遍历是否结束。

遍历数组

下面是一个遍历数组的例子:

在这个例子中,我们使用 arrSymbol.iterator 方法得到了一个 Iterator 对象,然后使用 next() 方法依次遍历数组中的元素。

遍历字符串

除了数组,我们还可以使用 Iterator 遍历字符串。在这种情况下,每个字符被当作一个值返回。

-- -------------------- ---- -------
----- --- - --------
----- -------- - -----------------------

----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---- ----- ----- -
----------------------------- -- - ------ ---------- ----- ---- -

遍历 Map 和 Set

我们也可以使用 Iterator 遍历 Map 和 Set。

-- -------------------- ---- -------
----- --- - --- ------------- ---------- -------- ------------
----- --- - --- ------- -- ----
----- ----------- - -----------------------
----- ----------- - -----------------------

-------------------------------- -- - ------ - ------- -------- -- ----- ----- -
-------------------------------- -- - ------ - ------- -------- -- ----- ----- -
-------------------------------- -- - ------ ---------- ----- ---- -

-------------------------------- -- - ------ -- ----- ----- -
-------------------------------- -- - ------ -- ----- ----- -
-------------------------------- -- - ------ -- ----- ----- -
-------------------------------- -- - ------ ---------- ----- ---- -

Generator

Generator 是一个函数,它可以产生一系列值。与普通函数不同的是,Generator 函数可以被暂停和恢复执行。

基本用法

使用 Generator 函数需要在函数名前面加上一个星号“*”,并在函数体内使用 yield 关键字来产生值。

-- -------------------- ---- -------
--------- ----- -
    ----- --
    ----- --
    ----- --
-

----- -------- - ------

----------------------------- -- - ------ -- ----- ----- -
----------------------------- -- - ------ -- ----- ----- -
----------------------------- -- - ------ -- ----- ----- -
----------------------------- -- - ------ ---------- ----- ---- -

在这个例子中,我们定义了一个 Generator 函数 foo(),使用 yield 关键字产生了三个值。然后我们得到了一个 Iterator 对象 iterator,使用 next() 方法依次遍历 foo() 函数产生的值。

传值与返回值

我们还可以在调用 next() 方法的时候向 Generator 函数传递值,这个值可以在 Generator 函数内部被使用。同时,Generator 函数可以使用 return 方法来返回最后一个值。

-- -------------------- ---- -------
--------- ----- -
    --- - - ------
    --- - - ------
    --- ------ - - - --
    ------ -------
-

----- -------- - ------
----------------------------- -- - ------ ---------- ----- ----- -
------------------------------ -- - ------ ---------- ----- ----- -
------------------------------ -- - ------ -- ----- ---- -

在这个例子中,我们定义了一个 Generator 函数 sum(),它包含了两个 yield 关键字和一个 return 语句。在调用 next() 方法的时候,我们向 sum() 函数传递了两个值,这两个值分别赋值给了变量 a 和 b。然后我们返回了 a+b 的值。值得注意的是,调用 return 方法之后,Generator 函数会直接结束,即使后面还有 yield 语句。

生成器和迭代器

在前面的例子中,我们使用了一个 Generator 函数 foo(),然后得到了一个 Iterator 对象 iterator。真正的魔力在于,我们还可以将这两者结合起来使用。

-- -------------------- ---- -------
--------- ----- -
    ----- --
    ----- --
-

--- ---- ----- -- ------ -
    -------------------
-

-- ---
-- ----- -------- - ------
-- ----- ------ -
--     ----- ------ - ----------------
--     -- ------------- ------
--     --------------------------
-- -

-- --
-- -
-- -

在这个例子中,我们定义了一个 Generator 函数 foo(),然后在 for...of 循环中使用了它。for...of 循环会得到一个 Iterator 对象,然后依次遍历 foo() 函数产生的值。在这个例子中,我们得到的输出结果是 1 和 2。

总结

在 ES6 中,Iterator 和 Generator 是两个很有用的特性。它们可以让开发者更加高效地遍历和产生数据。学习和使用它们可以让我们的代码更加简洁和易读。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6653f4dcd3423812e488474e

纠错
反馈