我想知道JavaScript中XMLHttpRequest
对象的标准类型是什么。根据引擎的不同,我发现了不同的结果。
在Firefox和Chrome中:
typeof XMLHttpRequest //=> "function"
在Safari中:
typeof XMLHttpRequest //=> "object"
W3C规范使用interface
关键字来定义XMLHttpRequest
,which is not used in practice:
[Constructor(optional XMLHttpRequestOptions options)]
interface XMLHttpRequest : XMLHttpRequestEventTarget {
// ...
}
XMLHttpRequest是一个JavaScript对象......
但Firefox返回"function"
,因此该术语至少含糊不清。该定义现在还指出:
现在正在W3C中进行标准化。
我在这里和那里看得更多,但没有明确答案™。有没有?
除此之外,还有一些额外的背景
我刚修正了此代码中的错误:
if (typeof XMLHttpRequest === "function") {
// do something
}
此错误仅发生在Safari 7中(其他版本没有测试)。该代码在Firefox和Chrome中运行良好。修复是:
if (typeof XMLHttpRequest !== "undefined") {
// do something
}
问题来自假设typeof XMLHttpRequest
在任何地方都是一样的......
答案 0 :(得分:3)
typeof XMLHttpRequest
应该返回"function"
。
如果使用
[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
}