Function.prototype.toString从正则表达式 /^\s*(?:function)?*/可知1: GeneratorFunction 不管书写是 function* 还是 function * 在 Function.prototype.toString 之后为 function注意在 ES2019 的 Function.prototype.toString revision 已经开始返回原始内容, 包含空格function * fn() {}Function.prototype.toString.call(fn); node < 10, 输出 function fn() {} node >=10, 输出 function * fn() {}2: function 可选是因为对象简写语法var o = { fn() {},};// fn() {}console.info(Function.prototype.toString.call(o.fn));Object.prototype.toString 获取类型在 ES2015 后不可靠var hasToStringTag = typeof Symbol === ‘function’ && typeof Symbol.toStringTag === ‘symbol’;if (!hasToStringTag) { var str = toStr.call(fn); return str === ‘[object GeneratorFunction]’;}ES2015 提供了 [Symbol.toStringTag] 修改 Object.prototype.toString() 返回的类型标签function fn() {}Object.defineProperty(fn, Symbol.toStringTag, { get() { return ‘MyTag’; },});// [object MyTag]console.log(Object.prototype.toString.call(fn));获取 GeneratorFunction 原型通过 Function 构造一个 GeneratorFunction, 通过 Object.getPrototypeOf 获得原型var getProto = Object.getPrototypeOf;var generatorFunc = Function(‘return function() {}’)();var GeneratorFunction = getProto(generatorFunc);参考文档is-generator-functionFunction-prototype-toString-revision文章若有纰漏请大家补充指正,谢谢~~ http://blog.xinshangshangxin.com SHANG 殇