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

前端之家收集整理的这篇文章主要介绍了javascript – 如何检查变量是否是生成器函数? (例如函数*产量)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > 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 a constructor 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检查,但上面仍然会错误识别它.你不能在野外信任构造函数,人们把它弄得太乱了.

猜你在找的JavaScript相关文章