有没有办法在javascript中创建类似python的生成器?

时间:2018-06-11 18:06:57

标签: javascript python iterator generator

在python中,如果你循环(或使用)

  1. iterator
  2. 函数返回值
  3. 你甚至不知道你有哪一个。因此,如果您已从被调用方返回或生成了要在调用者中使用的值,则来自调用者方无关紧要。

    但是,据我所知,如果你想使用yield,你必须在javascript中明确地用星号标记函数*,并且不能像"常规函数那样处理计算值&#39 ; s返回值"在来电方面。

    是否有javascript中的抽象来隐藏这些差异以获得与python相同的漂亮抽象?

1 个答案:

答案 0 :(得分:1)

JavaScript中有几种结构,调用者不需要知道被调用的函数是生成器,还是需要返回数组,字符串,Map等的普通函数。这些返回值都具有共同点,它们是可迭代的。

以下是关于如何处理此类函数的返回值的两个示例:

  1. 迭代值:

    N=NaN

    根据for (let x of f()) { // ... } 返回的内容,f()将如下所示:

    • 迭代字符串:获取每个字符
    • 迭代一个数组:获取它的每个元素
    • 迭代地图:获取它的每个键/值对
    • 迭代一个迭代器(可能由生成器返回):从中获取每个产生的值
    • ...
  2. 根据值创建数组:

    x

    或者:

    const copy = Array.from(f());
    

    注意:const copy = [...f()]; 的好处是它接受一个回调函数作为第二个参数:为每个值调用一个映射器。

  3. 将值作为参数传播到另一个函数

    如果值是数字:

    Array.from

    由于Math.min(...f()); 可以接受多个参数(不只是两个),因此它给出了整个系列的最小值(如Math.min在Python中所做的那样)。

  4. 阅读有关迭代器和迭代的更多信息on MDN