JavaScript中的XMLHttpRequest是什么类型的?

Eri*_*ton 7 javascript safari xmlhttprequest

我想知道XMLHttpRequestJavaScript中标准类型的对象是什么.根据引擎的不同,我发现了不同的结果.

在Firefox和Chrome中:

typeof XMLHttpRequest //=> "function"
Run Code Online (Sandbox Code Playgroud)

在Safari中:

typeof XMLHttpRequest //=> "object"
Run Code Online (Sandbox Code Playgroud)

W3C规范使用interface关键字来定义XMLHttpRequest,这在实践中没有使用:

[Constructor(optional XMLHttpRequestOptions options)]
interface XMLHttpRequest : XMLHttpRequestEventTarget {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

MDN定义指出:

XMLHttpRequest是一个JavaScript对象......

但Firefox回归"function",所以这个词至少含糊不清.该定义还指出:

它现在正在W3C中进行标准化.

我在这里和那里看了一下,但没有明确的答案 ™.有没有?

除此之外,还有一些额外的背景


问题的背景

我刚修复了这段代码中的错误:

if (typeof XMLHttpRequest === "function") {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,只在Safari 7中发生了这个错误(没有对其他版本进行测试).该代码在Firefox和Chrome中运行良好.修复是:

if (typeof XMLHttpRequest !== "undefined") {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

问题来自于假设typeof XMLHttpRequest各地都一样......

aps*_*ers 3

根据 ECMAScript 5 和 Web IDL 规范,Safari 在这里似乎是错误的。typeof XMLHttpRequest应该返回"function"

WebIDL规范说

如果使用扩展属性声明接口[Constructor],则可以将接口对象作为函数调用以创建实现该接口的对象。

...

接口对象的内部[[Call]]方法的行为如下......

同时,ESCAScript 5 规范中的规范typeof有一个返回值表,其中包含以下条目:

对象(本机或主机并执行[[Call]]):"function"

对象(主机且不实现[[Call]]):由实现定义,但可能不是"undefined""boolean""number""string"

从这个表中,我们可以看到任何实现的对象(本机或主机)[[Call]]都需要导致typeofyield "function"。WebIDL 规范需要[Constructor]接口对象来实现[[Call]],因此它们应该产生"function"