什么是检查函数是否是生成器的可靠方法,例如:
let fn = function* () { yield 100; } if (fn instanceof ??) { for (let value in fn()) { ... } }
我能想到的唯一方法就是fn.toString().startsWith('function*')
那种非常黑客和不可靠的方式
context:nodejs 4+
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
野外,人们把它弄得太乱了.