最可靠方式是 Object.prototype.toString.call(gen) === '[object Generator]',可安全识别 Generator 和 AsyncGenerator 对象,且兼容性好、不受篡改影响。

可以通过 Object.prototype.toString.call() 配合 [object Generator] 字符串判断,这是最可靠、兼容性最好的方式。
使用 Object.prototype.toString.call()
Generator 对象的内部 [[Class]] 标签为 "Generator",toString 方法能安全读取它,且不受对象自定义 toString 方法干扰:
-
✅ 推荐写法:
Object.prototype.toString.call(gen) === '[object Generator]' - 适用于所有标准 Generator 函数返回的对象(包括
function*和async function*返回的 AsyncGenerator) - 对
null、undefined、普通函数、数组等都安全,不会报错
注意 typeof 无法识别 Generator
typeof 对 Generator 对象返回 "object",和普通对象、数组、正则等一样,不具备区分能力:
typeof function*(){}() // "object"typeof [] // "object"- 所以不能用
typeof gen === 'generator'—— 这会始终为false
避免依赖 constructor 或 Symbol.toStringTag
虽然 Generator 实例通常有 gen.constructor === GeneratorFunction.prototype.constructor,但该属性可被篡改;Symbol.toStringTag 同样可被覆盖,不可靠:
立即学习“Java免费学习笔记(深入)”;
- 不建议:
gen.constructor && gen.constructor.name === 'GeneratorFunction'(构造器可能被改写) - 不建议:
gen[Symbol.toStringTag] === 'Generator'(可被赋值覆盖) - 只有
Object.prototype.toString是规范定义的、不可轻易覆盖的检测途径
补充:区分 Generator 和 AsyncGenerator
如果还需区分普通 Generator 和 async function* 返回的 AsyncGenerator,两者 toString 结果不同:
-
Object.prototype.toString.call(gen) === '[object Generator]'→ 普通 Generator -
Object.prototype.toString.call(asyncGen) === '[object AsyncGenerator]'→ 异步生成器 - 二者都属于“生成器类对象”,但语义和行为不同,按需分别判断即可


















