ES6 中的 Iterator 与 Iterable 接口的应用

阅读时长 4 分钟读完

在 ES6 中,Iterator 与 Iterable 接口成为了重要的概念。Iterator 是一种数据遍历的规范,Iterable 接口则是让对象成为可遍历对象的方法,这两者可以一起使用来实现数据的迭代。

Iterator

Iterator 是一种遍历数据的规范,是一个对象,具有 { next: () => {value: any, done: boolean}} 的结构。其中,next() 方法用于返回下一个遍历对象。

在上述例子中,我们可以看到 data[Symbol.iterator]() 返回的是一个 iterator 对象。该对象一共有三个值,每次调用 next() 方法后返回一个值。当遍历结束时,done 属性变为 truevalue 的值则是 undefined。

我们利用 Iterator 可以遍历各种类型对象,甚至是异步迭代器。

Iterable

Iterable 接口是让对象成为可迭代对象的手段。一个对象要实现 Iterable 接口,必须具备一个函数 Symbol.iterator,函数返回一个 Iterator 对象,该对象包含 next() 方法。

以下是一个简单的实现:

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

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

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

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

在上述例子中,我们定义了一个 Counter 类,其中 Symbol.iterator 返回一个 Generator 实现,这意味着我们可以方便地使用 yield 来实现数据的迭代。

应用

Iterator 和 Iterable 接口为我们提供了极大的灵活性。我们可以通过它来遍历各种对象,从而方便地操作数据、写出更简洁的代码。

使用场景

  • 循环:使用 for...of 来循环一个 Iterable 对象,例如数组、Generator
  • 扩展语法:使用 ... 操作符来扩展一个 Iterable 对象,例如 [...array]
  • 解构赋值:可以通过解构操作来将一个 Iterator 对象转成数组,例如 [a, b, ...rest] = array

我们可以将上述例子中的 Counter 类再改写一下,让它支持起 to_array 方法。

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

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

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

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

在上面的例子中,我们已经将 Iterator 和 Iterable 接口相结合,使得 Counter 类具备了 Iterable 的特征,可以使用 ... 操作符和解构操作来方便地操作数据。

总结

ES6 中的 Iterator 和 Iterable 接口为我们提供了数据迭代的规范和标准,使得数据遍历变得简单方便。我们可以通过 Iterator 和 Iterable 接口来快速实现可遍历对象的迭代,从而方便我们对数据的操作和处理。同时,Iterator 和 Iterable 接口的应用也使得我们的代码更加优雅和简洁。

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

纠错
反馈