ECMAScript 2017 中的迭代器和生成器:更好地控制迭代

ECMAScript 2017 中的迭代器和生成器:更好地控制迭代

随着 ECMAScript 2017 的到来,迭代器和生成器迎来了一些不错的更新。这些更新不仅提升了 JavaScript 语言的文件性和可读性,同时也为我们提供了更好地控制迭代的方案。在本文中,我们将深入探讨这些变化,并提供一些有用的指导意义和示例代码,帮助你更好地理解和应用这些特性。

迭代器 Iterators

在 JavaScript 语言中,迭代器(Iterators)负责遍历一个容器(比如数组、Map 和 Set)。在 ES2015 之前,我们通常使用 for 循环来遍历这些容器,但是这种方式有一些明显的局限性,例如不能遍历非数组类型的容器,而且代码可读性较差。

在 ECMAScript 2015 中,引入了迭代器接口,使得我们可以遍历任何可迭代对象。下面是一个示例:

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

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

这里,我们使用 Symbol.iterator 方法获取到数组 arr 的默认迭代器,并遍历其所有元素。这个迭代器返回一个对象,包含一个 value 属性和一个 done 属性。value 属性是迭代器的下一个值,done 属性表示迭代器是否已经遍历完。

在 ES2017 中,我们可以使用 for-of 循环来遍历一个可迭代对象,例如:

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

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

生成器 Generators

生成器是一种可以按需生成值序列的函数。与普通函数不同,生成器可以在每次调用时返回一个值,并延迟计算下一个值,直到调用下一个值时再次进行计算。下面是一个简单的示例:

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

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

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

这里,我们定义了一个生成器函数,并在其中使用 yield 关键字依次返回值。当我们调用生成器的 next 方法时,函数会执行到下一个 yield 语句,并返回 value 值。一旦所有 yield 语句都已经执行完毕,生成器的 done 属性就会变为 true。

在 ES2017 中,我们引入了一些新的方法和语法来简化生成器的使用。主要是新增了 yield* 语法和带有迭代协议的生成器。下面是一个示例:

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

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

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

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

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

这里,我们首先使用 yield* 语法将一个数组中的元素加入到生成器返回的值序列中。另一个示例展示了如何使用带有迭代协议的生成器来遍历一个数组,并使用 for-of 循环。

结论

迭代器和生成器是 JavaScript 语言中非常有用的特性,可以帮助我们更好地控制和遍历容器和值序列。在 ES2017 中,它们得到了一些不错的更新,使得这些特性更加易用和灵活。我们希望这篇文章能够帮助你更好地理解它们,并在你的项目中应用它们。

参考文献

  1. MDN - Iterators and Generators
  2. TC39 - ECMAScript® 2017 Language Specification

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671ef99b2e7021665efadcae