使用 ECMAScript 2020 (ES11) 创建自定义迭代器

阅读时长 6 分钟读完

前言

在前端开发领域,JavaScript(简称JS)是最常用的编程语言之一。JavaScript 的标准化组织是 ECMA(European Computer Manufacturers Association),在 ECMA-262 标准中定义了 JS 的语法规则和功能。每年,ECMA 都会发布一次新的标准。自1997年以来,ECMAScript(简称ES)被用作 JavaScript 的正式名称。其中,ES11(也称为 ECMAScript 2020)是目前 JavaScript 中最新的标准版本。

在 ES11 中,迭代器(Iterable)和迭代器协议(Iterator Protocol)是一项非常重要的功能。本篇文章将详细介绍 ES11 中迭代器协议的基本概念、使用方法以及在自定义迭代器方面的应用。

迭代器协议

迭代器协议规定了一种标准的方式来遍历任何一个对象。换言之,只要一个对象实现了迭代器协议,就可以使用 for...of 循环来遍历该对象的元素。

在 ES11 中,一个对象要实现迭代器协议需要包含一个名为 Symbol.iterator 的方法。这个方法返回一个满足迭代器协议的对象,这个对象需要包含一个名为 next 的方法。在使用 for...of 循环时,for...of 会反复调用 next 方法,直到遍历完所有的元素。

实现一个自定义迭代器

通过实现迭代器协议,我们可以非常容易地为任何对象创建自定义迭代器。

例如,我们可以创建一个实现了迭代器协议的类,这个类使用一个简单的数组表示。

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

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

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

上述代码中,我们通过定义 [Symbol.iterator] 方法来实现了迭代器协议。这个方法返回了一个对象,这个对象有一个 next 方法。在 next 方法中,我们按顺序访问了传入的数组的每个元素,如果还没有遍历完,我们将返回 value 属性和 done 属性为 false。当遍历结束时,next 方法将返回 done 属性为 true

现在我们创建一个对象 iterable,它是以上 class CustomIterable 的一个实例。然后我们就可以使用 for...of 循环遍历其中的元素了。

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

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

应用场景

在日常编程工作中,自定义迭代器通常是用于遍历数据集合的。我们可以将自定义迭代器与生成器函数(Generator Function)一起使用,来更好地实现一些复杂的逻辑。

下面是一个将自定义迭代器与生成器函数结合使用的示例。在这个示例中,我们将一个名为 weatherData 的二位数组转化为一个以日期为键的对象。

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

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

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

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

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

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

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

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

通过将迭代器和生成器函数集成起来,我们可以轻松地遍历任何数据集合,并按照指定的逻辑将原始数据转化为一些新的数据结构。这种技术在我们的日常工作中非常有用。

总结

ES11 引入了迭代器协议这一非常重要的特性。只要实现了迭代器协议的对象,就可以使用 for...of 循环遍历其中的元素。在编写自定义迭代器时,可以结合使用生成器函数和其他高级语法,以实现高效、灵活的数据转化和处理。在实际编程过程中,自定义迭代器是一个非常有用的工具,可以大大简化代码,提高代码复用率。

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

纠错
反馈