参见英文答案 >
check if function is a generator10个
什么是检查函数是否是生成器的可靠方法,例如:
什么是检查函数是否是生成器的可靠方法,例如:
let fn = function* () { yield 100; } if (fn instanceof ??) { for (let value in fn()) { ... } }
我能想到的唯一方法是fn.toString().startsWith(‘function *’)但这非常hacky且不可靠
context:nodejs 4
解决方法
Erik Arvidsson makes a good point in this answer到这个问题的早期版本(我没想到它是一个欺骗),因为任何函数都可以返回一个迭代器,检查一个函数是否是一个生成器没什么意义.也就是说,实际上你可以用信息做很多事情,因为非生成器可以返回迭代器.
之前我错了,有一个比你的toString检查更好的方法(如果由于某种原因你有一个有效的需要完成它):
>(一次)获取生成器函数的默认构造函数的值,即specified here.它没有像函数这样的全局函数.
>(每当需要检查时)检查您的目标函数是否是该生成器函数构造函数的实例.
例如.:
// Once var GeneratorFunction = (function*(){}).constructor; // Whenever you need to check if (fn instanceof GeneratorFunction) { // Yep,it's a generator function }
旧事物排除在外:
我没有在规范中看到任何可以直接访问[[FunctionKind]]内部插槽的内容.
规范does say:
Unlike function instances,the object that is the value of the a GeneratorFunction’s
prototype
property does not have aconstructor
property whose value is the GeneratorFunction instance.
所以在理论上:
if (!fn.prototype.hasOwnProperty("constructor")) { // It's a generator function }
但是,这将是非常不可靠的,因为人们总是做这样的事情(尽管人们开始使用课堂时希望不那么好):
function Foo() { } Foo.prototype = { method: function() {} };
虽然那个Foo.prototype对象有一个构造函数属性,但它是继承的,而不是“拥有”.我们可以做一个检查,或.constructor == fn检查,但上面仍然会错误识别它.你不能在野外信任构造函数,人们把它弄得太乱了.