解决 ECMAScript 2018 中的 Symbols 和 Iterator 的迭代器

在 ECMAScript 2018 标准中,Symbols 和 Iterator 是两个非常重要的新特性。Symbol 是一种新的原始数据类型,可以用来创建唯一的标识符。而 Iterator 则是一种新的迭代器接口,可以用来遍历可迭代对象。

在本文中,我们将探讨如何使用 Symbols 和 Iterator 来创建迭代器,并解决一些常见的问题。

Symbols

Symbols 可以用来创建唯一的标识符,这些标识符可以用于对象的属性名,以及其他一些场合。Symbols 是一种原始数据类型,使用 Symbol 函数进行创建。

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

每个 Symbol 都是唯一的,即使创建时传入的参数相同。这是因为 Symbol 的内部实现使用了一个全局的注册表,来维护已经创建过的 Symbol。

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

Symbols 作为属性名

由于 Symbols 是唯一的,因此可以用来作为对象的属性名,避免了属性名冲突的问题。

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

内置 Symbols

ECMAScript 2018 中定义了一些内置的 Symbols,用于表示一些特殊的行为。例如,Symbol.iterator 用于表示一个对象是否可迭代。我们将在下一节中详细讨论这个问题。

Iterator

Iterator 是一种新的迭代器接口,可以用来遍历可迭代对象。可迭代对象是一种具有 Symbol.iterator 方法的对象,该方法返回一个迭代器对象。

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

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

在上面的例子中,我们创建了一个可迭代对象 myIterable,它具有 Symbol.iterator 方法,该方法返回一个迭代器对象。迭代器对象具有 next 方法,每次调用该方法都会返回一个包含 value 和 done 属性的对象。当 done 为 true 时,表示迭代已经结束。

内置可迭代对象

ECMAScript 2018 中定义了一些内置的可迭代对象,例如数组、Set、Map 等。这些对象都具有 Symbol.iterator 方法,因此可以使用 for...of 循环来遍历。

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

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

解决迭代器问题

有时候我们需要对一个可迭代对象进行多次迭代,或者在迭代过程中进行一些额外的操作。这时候,我们可以使用 Generator 函数来创建一个迭代器。

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

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

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

在上面的例子中,我们使用 Generator 函数 myGenerator 来创建一个迭代器。每次调用 myIterator.next() 方法都会返回一个包含 value 和 done 属性的对象。

注意,Generator 函数的执行是惰性的,即只有在调用 next 方法时才会执行。因此,我们可以在迭代过程中进行一些额外的操作,例如修改迭代器的状态。

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

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

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

在上面的例子中,我们创建了一个可以重置的迭代器。每次调用 myIterator.next(reset) 方法时,如果 reset 为 true,则会将迭代器的状态重置为 0。

总结

Symbols 和 Iterator 是 ECMAScript 2018 中的两个重要特性。Symbols 可以用来创建唯一的标识符,Iterator 可以用来遍历可迭代对象。我们可以使用 Symbols 和 Iterator 来解决一些常见的迭代器问题,例如多次迭代和迭代器状态的修改。

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