【发布时间】:2014-02-28 19:52:49
【问题描述】:
假设我有一个像这样的生成器函数:
var g = function*() {
yield 1;
yield 2;
yield 3;
};
var gen = g();
如何以编程方式判断 g 是生成器函数,还是 gen 是迭代器?
这似乎是一种可能性:
g.constructor.name === 'GeneratorFunction'
有没有更好的办法?
更新:我最终得到了类似于Eric's answer 的taking an approach,但首先使用eval 来确定目标平台是否支持生成器。这是实现:
var GeneratorConstructor = (function() {
try {
var generator;
return eval('generator = function*() { yield 1; };').constructor;
} catch (e) {
// If the above throws a SyntaxError, that means generators aren't
// supported on the current platform, which means isGenerator should
// always return false. So we'll return an anonymous function here, so
// that instanceof checks will always return false.
return function() {};
}
}());
/**
* Checks whether a function is an ES6 Harmony generator.
*
* @private
* @param {Function} fn
* @returns {boolean}
*/
function isGenerator(fn) {
return fn instanceof GeneratorConstructor;
}
【问题讨论】:
-
或者你可以更宽容地使用 typeof gen.next === "function" && typeof gen.throw === "function"
-
这仅在 fn 实际使用 GeneratorFunction 创建时才有效,对吗?有没有办法确定一个对象是否是从生成器创建的?在 firefox 中
gen['@@iterator']似乎已定义,但我无法为节点找出它。我很惊讶迭代器不是从 Iterator 派生的,所以gen instanceof Iterator可以工作。
标签: javascript generator ecmascript-harmony