由于我还在挖掘ES6并且因为我非常好奇并且我总是试图找到所有内容的原因,所以我正在尝试使用生成器函数试图解决像Traceur或Babel这样的编译器如何编译ES6代码到ES5.So我保存了构造函数,其实例是任何生成器函数,我提醒了它的一个实例的类型。结果是'函数'
window.GeneratorFunction = Object.getPrototypeOf(function*(){}).constructor
alert(typeof new GeneratorFunction()) // 'function'
据我所知,构造函数的一个实例是一个对象
alert(typeof new String()) // 'object'
alert(typeof new Number()) // 'object'
为什么GeneratorFunction()构造函数有函数实例?
答案 0 :(得分:0)
可能因为typeof new Function() === 'function'
也是true
。见What is Function's Data Type : function or object? in JavaScript
答案 1 :(得分:0)
在JavaScript中,主要有两个值组:
主语是字符串,数字,BigInts,符号,布尔值和空值(null
和undefined
)。
其他所有对象都是对象,包括数组,类实例,日期(不是水果),promise和许多其他东西。
函数是特殊的对象:它们具有对象所具有的所有属性,但还有一个:它们是可调用的(我的意思是[[Call]]
可以)。
只允许构造函数返回对象,但是由于函数也是对象,因此返回函数是有效的。 Function
,GeneratorFunction
和AsyncFunction
也是如此(后两者不能直接使用)。
但是,如果它们是对象,为什么typeof
不为它们返回"object"
?
这有点复杂。 typeof
做的事情很奇怪。例如,it returns "object"
for null
,它实际上是一个原始类型。
但是,returns "function"
for every callable object (i.e. function)很有用,因为这是检查对象是否可调用的唯一真实方法(不计算try..catch
hacks)。
总而言之,new GeneratorFunction()
返回一个函数对象,其对象typeof
的表示形式为"function"