ECMAScript 2017(ES8):在 JavaScript 中使用 Iterator 和 Generator 进行自定义迭代器

ECMAScript 2017(ES8):在 JavaScript 中使用 Iterator 和 Generator 进行自定义迭代器

ECMAScript 2017(ES8)是 JavaScript 的最新更新,其中包含了许多新功能,其中一个特别有趣的更新是 Iterator 和 Generator,这是用于迭代和生成可迭代对象的新工具。在本文中,我们将深入探讨这两项新特性以及如何使用它们来创建自定义迭代器。

什么是 Iterator?

Iterator 是一个新的对象,它定义了一种标准的访问数据结构的方式,可以对所有可迭代对象(如数组,字典,字符串等)进行迭代。与 ES6 之前一样,我们仍然可以使用 for 循环,for-in 循环等迭代可迭代对象的方法,但 Iterator 提供了更加简便,稳定且强大的迭代方法。

Iterator 对象包括一个 next() 方法,该方法返回一个包含 done 和 value 两个属性的对象,done 用于标识迭代是否完成,value 则为当前迭代元素的值。如果我们已经遍历了所有迭代元素,done 将为 true,否则为 false。

示例代码:

const myArray = [1,2,3]; const myIterator = myArraySymbol.iterator; console.log(myIterator.next()); // {done: false, value: 1} console.log(myIterator.next()); // {done: false, value: 2} console.log(myIterator.next()); // {done: false, value: 3} console.log(myIterator.next()); // {done: true, value: undefined}

我们使用 Symbol.iterator() 方法从 myArray 对象中获得唯一 Iterator 对象。在后续的调用中,每次使用 next() 方法从 Iterator 对象中获取下一个元素,一旦到达最后一个元素,则会返回 { done: true, value: undefined }。

什么是 Generator?

Generator 是一种函数,它可以在函数的一次调用中启动、暂停和重新启动它的执行。Generator 函数可以使用 yield 语句来发出指定的值,并在捕获这些值时暂停执行。与普通函数不同的是,Generator 函数的执行不会被包含其执行的代码所阻塞,而是在需要时产生值。

示例代码:

function* myGenerator() { yield 1; yield 2; yield 3; }

const myIterator = myGenerator(); console.log(myIterator.next()); // {done: false, value: 1} console.log(myIterator.next()); // {done: false, value: 2} console.log(myIterator.next()); // {done: false, value: 3} console.log(myIterator.next()); // {done: true, value: undefined}

我们定义了一个名为 myGenerator 的 Generator 函数,用 yield 来产生一个值,在调用 myGenerator() 函数时,会返回可迭代的 Iterator 对象。然后使用 next() 方法从 Iterator 对象中获得下一个值,我们可以使用这些 yield 的值来执行所需的操作。

如何使用 Iterator 和 Generator 创建自定义迭代器?

利用 Iterator 和 Generator,我们可以创建自定义迭代器。自定义迭代器可以是任何数据结构,只要它实现了 Iterator 接口,即必须实现 Symbol.iterator 方法。我们使用 Generator 来生成序列的值,如下面的示例:

const customIterator = { *Symbol.iterator { yield 'Hello'; yield 'World'; yield '!'; } };

for (const value of customIterator) { console.log(value); // 'Hello', 'World', '!' }

我们定义了一个 customIterator 对象,并使用一个 Generator 函数来生成值序列。这个对象同时也实现了 Symbol.iterator 方法,使其成为一个可迭代的对象,我们可以使用 for-of 循环来遍历整个迭代器并输出 value。

结论

ECMAScript 2017 引入的 Iterator 和 Generator 是一项非常有用的更新,可以更轻松地处理可迭代的对象,并且可以轻松创建自定义迭代器。迭代器的使用能够使代码更加清晰,易于调试和维护。因此,当进行迭代时,我们建议使用 Iterator 和 Generator,可以让代码更加高效,简洁和易于维护。

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