当前位置:  开发笔记 > 编程语言 > 正文

如何检查变量是否是生成器函数?(例如功能*产量)

如何解决《如何检查变量是否是生成器函数?(例如功能*产量)》经验,为你挑选了1个好方法。

什么是检查函数是否是生成器的可靠方法,例如:

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

if (fn instanceof ??) {
   for (let value in fn()) {
       ...
   }
}

我能想到的唯一方法就是fn.toString().startsWith('function*')那种非常黑客和不可靠的方式

context:nodejs 4+



1> T.J. Crowder..:

Erik Arvidsson在这个问题的早期版本的答案中提出了一个很好的观点(我没有想到它是一个骗局),因为任何函数都可以返回一个迭代器,所以检查一个函数是否是一个生成器没什么意义或不.也就是说,实际上你可以用信息做很多事情,因为非生成器可以返回迭代器.


我错了之前,还有就是比你的更好的方法toString检查(如果由于某种原因,你有一个有效的需求做的话):

    (一次)获取constructor生成器函数的默认值,此处指定.它没有像全球一样的东西Function.

    (无论何时需要检查)检查目标函数是否instanceof是生成器函数构造函数.

例如:

// Once
var GeneratorFunction = (function*(){}).constructor;

// Whenever you need to check
if (fn instanceof GeneratorFunction) {
    // Yep, it's a generator function
}

排除旧事物:

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

规范确实说:

与函数实例不同,作为GeneratorFunction prototype属性值的对象没有constructor属性,其值为GeneratorFunction实例.

所以在理论上:

if (!fn.prototype.hasOwnProperty("constructor")) {
    // It's a generator function
}

但是,这将是非常不可靠的,因为人们总是做这样的事情(虽然人们开始使用时希望不那么好class):

function Foo() {
}
Foo.prototype = {
    method: function() {}
};

虽然该Foo.prototype对象具有constructor属性,但它是继承的,而不是"拥有".我们可以进行in检查或.constructor == fn检查,但上述内容仍会错误识别.你只是不能相信constructor野外,人们把它弄得太乱了.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有