ES6 中 Symbol.iterator 的使用及实现

阅读时长 6 分钟读完

前言

在 ES6 中,引入了 Symbol 类型,它是一种新的原始数据类型,用于表示独一无二的值。其中,Symbol.iterator 是用来定义对象的默认迭代器的属性。在本文中,我们将详细介绍 Symbol.iterator 的使用及实现方式。

Symbol.iterator 的作用

在 ES6 中,许多内置的数据结构都实现了 Symbol.iterator 属性,例如数组、Set、Map 等。这意味着我们可以使用 for...of 循环来遍历这些数据结构的值。

使用 Symbol.iterator 属性,我们可以自定义对象的迭代器。这样,我们就可以使用 for...of 循环来遍历我们自己定义的对象了。

Symbol.iterator 的使用示例

下面是一个简单的示例,展示了如何使用 Symbol.iterator 来自定义对象的迭代器:

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

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

在上面的示例中,我们定义了一个名为 myObj 的对象,并在该对象上定义了一个 Symbol.iterator 方法。该方法返回一个迭代器对象,每次调用 next() 方法时,都会返回一个包含 value 和 done 两个属性的对象。

在 for...of 循环中,我们使用了 myObj 对象的迭代器来遍历该对象的值。这样,我们就可以像遍历数组一样遍历我们自己定义的对象了。

Symbol.iterator 的实现方式

上面的示例中,我们使用了 Symbol.iterator 方法来定义对象的迭代器。该方法返回一个迭代器对象,该对象包含 next() 方法,用于返回迭代器中下一个值。

下面是一个更复杂的示例,展示了如何使用 Symbol.iterator 来实现一个自定义的双向链表:

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

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

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

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

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

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

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

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

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

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

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

在上面的示例中,我们定义了一个名为 LinkedList 的类,用于表示双向链表。在该类中,我们定义了 add() 方法,用于向链表中添加节点。

为了实现迭代器,我们在 LinkedList 类中定义了 forwardIterator() 和 reverseIterator() 两个方法,分别用于正向和反向遍历链表。在 forwardIterator() 方法中,我们从头节点开始遍历链表,每次调用 next() 方法时,都会返回下一个节点的值。在 reverseIterator() 方法中,我们从尾节点开始遍历链表,每次调用 next() 方法时,都会返回上一个节点的值。

在 LinkedList 类中,我们还定义了 Symbol.iterator 方法,用于返回正向遍历链表的迭代器。在我们使用 for...of 循环遍历链表时,就会使用该迭代器。

在最后的示例中,我们先使用正向遍历链表的迭代器来遍历链表的值。然后,我们将 LinkedList 类的 Symbol.iterator 方法重新定义为 reverseIterator() 方法,这样,我们就可以使用反向迭代器来遍历链表的值了。

总结

在本文中,我们介绍了 ES6 中 Symbol.iterator 的使用及实现方式。通过自定义对象的迭代器,我们可以使用 for...of 循环来遍历我们自己定义的对象。在实现自定义迭代器时,我们需要定义一个包含 next() 方法的迭代器对象。

希望本文能够对前端开发者们有所帮助,让大家更加深入地理解 ES6 中 Symbol.iterator 的使用及实现方式。

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

纠错
反馈