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() {}
};