什么是迭代器生成函数?
在 JavaScript 中,一个函数如果使用了 function*
的语法声明,就被称为一个迭代器生成函数。该函数返回一个迭代器对象,可以用 for of
循环语句来遍历迭代器对象中的值。
迭代器生成函数通过使用 yield
关键字暂停函数的执行,等待迭代器请求下一个值时再恢复执行。这允许开发者在生成迭代器对象的过程中逐步计算值,而不是一次性计算出所有值并在一个数组中返回。
一个例子:
-- -------------------- ---- ------- --------- ----- - --- - - -- - - -- ----- ------ - ----- -- --- -- - --- ----- - - --- ---- - -- ------ - -- -- - ---- ------ --------------- -
这个例子中,我们定义了一个 fib()
函数,它返回一个斐波那契数列。通过使用 for of
循环语句可以迭代所有小于 100 的斐波那契数。
ECMAScript 2018 的新功能
ECMAScript 2018 引入了几个新功能,其中之一是使用 yield*
关键字来递归生成迭代器对象。
下面的例子中,我们定义了一个迭代器生成函数,它递归生成斐波那契数列:
-- -------------------- ---- ------- --------- ----- - --- - - -- - - -- ----- ------ - ----- -- --- -- - --- ----- ------ ----------- - - --------- ---------- - --- - - -- - - ---- ----- ------ - ----- -- --- -- - --- ----- - -
在这个例子中,我们定义了一个新的迭代器生成函数 fibFrom()
,它以给定的初始值作为起点来生成新的斐波那契数列。我们使用 yield*
关键字将其作为子生成器来嵌入到 fib()
中,从而实现了递归生成斐波那契数列的效果。
我们可以像以前一样使用 for of
循环语句来遍历 fib()
,但是这次我们将会得到所有斐波那契数:
for (let x of fib()) { if (x > 10000) break; console.log(x); }
示例代码
完整的示例代码如下:
-- -------------------- ---- ------- --------- ----- - --- - - -- - - -- ----- ------ - ----- -- --- -- - --- ----- ------ ----------- - - --------- ---------- - --- - - -- - - ---- ----- ------ - ----- -- --- -- - --- ----- - - --- ---- - -- ------ - -- -- - ------ ------ --------------- -
总结
使用迭代器生成函数和递归生成器的结合,使得我们更加方便地生成体积系统的数据结构。除了上面演示的斐波那契数列外,我们还可以通过嵌套使用迭代器生成函数和单个生成器来实现更复杂的迭代数据结构,如树形结构和图等。学习这些新的功能将会使我们更加高效地编写代码,并在可能的情况下减少代码复杂性和代码量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/665449ced3423812e48f2541