Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检查变量是否为生成器函数?(例如函数*收益率)_Javascript_Node.js_Ecmascript 6 - Fatal编程技术网

Javascript 如何检查变量是否为生成器函数?(例如函数*收益率)

Javascript 如何检查变量是否为生成器函数?(例如函数*收益率),javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,检查功能是否为发电机的可靠方法是什么,例如: let fn = function* () { yield 100; } if (fn instanceof ??) { for (let value in fn()) { ... } } 我能想到的唯一方法是fn.toString().startsWith('function*'),但这是非常粗糙和不可靠的 上下文:nodejs 4+对于这个问题的早期版本(我没有想到这是一个重复),因为任何函数都可以返回迭代器

检查功能是否为发电机的可靠方法是什么,例如:

let fn = function* () {
    yield 100;
}

if (fn instanceof ??) {
   for (let value in fn()) {
       ...
   }
}
我能想到的唯一方法是
fn.toString().startsWith('function*')
,但这是非常粗糙和不可靠的

上下文:nodejs 4+

对于这个问题的早期版本(我没有想到这是一个重复),因为任何函数都可以返回迭代器,所以检查函数是否是生成器没有什么意义。也就是说,在实际应用中,您不能对信息做太多的处理,因为非生成器可以返回迭代器


我以前是错的,有一种比您的
toString
检查更好的方法(如果出于某种原因您确实需要这样做):

  • (一次)获取生成器函数的默认构造函数的值,即。它没有类似于
    的全局函数
    之类的函数

  • (无论何时需要检查)检查目标函数是否为该生成器函数构造函数的
    实例

  • 例如:


    旧事物被排除在外:

    我在规范中没有看到任何允许我们直接访问
    [[FunctionKind]]
    内部插槽的内容

    规范:

    和函数实例不同,作为GeneratorFunction的
    原型
    属性值的对象并没有值为GeneratorFunction实例的
    构造函数
    属性

    因此,理论上:

    if (!fn.prototype.hasOwnProperty("constructor")) {
        // It's a generator function
    }
    
    但是,这将是难以置信的不可靠,因为人们一直在做这样的事情(尽管随着人们开始使用
    ,希望会少一些):


    虽然
    Foo.prototype
    对象有一个
    constructor
    属性,但它是继承的,而不是“自己的”。我们可以在
    检查中执行
    ,或者执行
    .constructor==fn
    检查,但上述操作仍然会错误识别它。在野外,你不能信任构造函数,人们会把它搞得一团糟。

    也许你可以检查一下它是否定义了
    next
    ?刚刚试过,typeof fn.next是“未定义的”,你可能会做一些类似
    if(typeof fn().next=='function'){}/code>的事情,这不是迭代器函数,这是一个生成器函数。@saadq:但这会错误识别任何使用
    next
    方法返回对象的函数。
    toString
    非常可怕。请不要推荐这个。还有更好的方法,比如
    instanceof Generator
    (其中
    Generator
    是生成器函数的内置构造函数)。而且在任何情况下,将生成器函数与返回迭代器(或生成器)的任何其他(正常)函数区分开来都没有意义。@Bergi:我不推荐使用它。我回答了这个问题,这是如何,而不是你应该。@Bergi:规范定义的
    生成器
    符号在哪里?V8不知道,它不是一个实例属性(比如
    .prototype
    是-生成器函数是“构造函数”),它是一个。规范令人困惑:-)
    if (!fn.prototype.hasOwnProperty("constructor")) {
        // It's a generator function
    }
    
    function Foo() {
    }
    Foo.prototype = {
        method: function() {}
    };