JavaScript中XMLHttpRequest的类型是什么?

JavaScript中XMLHttpRequest的类型是什么?,javascript,safari,xmlhttprequest,Javascript,Safari,Xmlhttprequest,我想知道JavaScript中XMLHttpRequest对象的标准类型是什么。根据发动机的不同,我发现了不同的结果 在Firefox和Chrome中: typeof XMLHttpRequest //=> "function" 在狩猎中: typeof XMLHttpRequest //=> "object" W3C规范使用接口关键字定义XMLHttpRequest,: 缔约国指出: XMLHttpRequest是一个JavaScript对象 但是Firefox返回了“func

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

在Firefox和Chrome中:

typeof XMLHttpRequest //=> "function"
在狩猎中:

typeof XMLHttpRequest //=> "object"
W3C规范使用
接口
关键字定义
XMLHttpRequest
,:

缔约国指出:

XMLHttpRequest是一个JavaScript对象

但是Firefox返回了
“function”
,所以这个术语至少是模糊的。目前,该定义还规定:

W3C正在对其进行标准化

我到处看了看,但没有确定的答案™. 有吗

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


问题的背景 我刚刚修复了此代码中的一个错误:

if (typeof XMLHttpRequest === "function") {
  // do something
}
到目前为止,这个bug只出现在Safari7中(没有在其他版本上进行测试)。该代码在Firefox和Chrome中运行良好。解决办法是:

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

问题来自于假设XMLHttpRequest的
类型在任何地方都是相同的…

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

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


根据ECMAScript 5和Web IDL规范,Safari在这里似乎是错误的。XMLHttpRequest的类型应返回
“函数”

委员会:

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

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

同时,有一个返回值表,其中包含以下条目:

对象(本机或主机,并实现
[[Call]]
):
“函数”

对象(宿主且未实现
[[Call]]
):定义的实现可能不是
“未定义的”
“布尔值”
“数字”
,或
“字符串”


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

,而不是直接相关的,但是如果
XMLHttpRequest
没有定义,那么
XMLHttpRequest | | ActiveXObject
不会抛出引用错误吗?@jfriend00:OP就是这么说的——在Safari中,它奇怪地不是一个函数
XMLHttpRequest instanceof Function===false
。我一直认为构造函数必须是函数。(经验证,Safari 8.0.6)宿主对象有时遵循奇怪的规则,并且似乎标准化程度最低。它们不是纯Javascript对象——它们是通过Javascript公开的主机对象。解决方法是不要假设它是一种特定类型,并测试它是否未定义
@jfriend00:这难道不是事实吗。最新消息:浏览器存在不兼容性:PIt似乎Safari中的所有本地构造函数都是这样<代码>图像类型
位置类型
历史类型
都是
“对象”
。我不知道它是否相关,或者如何相关,但是
构造函数
\uuuuu proto\uuuu
属性在Safari中是一个普通的
对象
构造函数/实例,但在Firefox中是一个构造函数。是的,Safari只有另一个主机对象bug
if (typeof XMLHttpRequest !== "undefined") {
  // do something
}
if (window.XMLHttpRequest !== undefined) {
  // do something
}
if (this.XMLHttpRequest !== undefined) {
  // do something
}