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

阅读时长 5 分钟读完

在 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

纠错
反馈