JavaScript中的XMLHttpRequest是什么类型的?

时间:2015-06-09 01:32:37

标签: javascript safari xmlhttprequest

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

在Firefox和Chrome中:

typeof XMLHttpRequest //=> "function"

在Safari中:

typeof XMLHttpRequest //=> "object"

W3C规范使用interface关键字来定义XMLHttpRequestwhich is not used in practice

[Constructor(optional XMLHttpRequestOptions options)]
interface XMLHttpRequest : XMLHttpRequestEventTarget {
  // ...
}

MDN definition表示:

  

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

但Firefox返回"function",因此该术语至少含糊不清。该定义现在还指出:

  

现在正在W3C中进行标准化。

我在这里和那里看得更多,但没有明确答案™。有没有?

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

问题的背景

我刚修正了此代码中的错误:

if (typeof XMLHttpRequest === "function") {
  // do something
}

此错误仅发生在Safari 7中(其他版本没有测试)。该代码在Firefox和Chrome中运行良好。修复是:

if (typeof XMLHttpRequest !== "undefined") {
  // do something
}

问题来自假设typeof XMLHttpRequest在任何地方都是一样的......

2 个答案:

答案 0 :(得分:3)

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

WebIDL spec says

  

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

     

...

     

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

同时,specification for typeof in the ESCAScript 5 spec有一个带有条目的返回值表:

  

对象(原生或主机并实施[[Call]]): "function"

     

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

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

答案 1 :(得分:1)

如果您只想检查XMLHttpRequest是否存在,那么您可以使用:

if (typeof XMLHttpRequest !== "undefined") {
  // do something
}

if (window.XMLHttpRequest !== undefined) {
  // do something
}

if (this.XMLHttpRequest !== undefined) {
  // do something
}