我想知道在JavaScript中,
在Firefox和Chrome中:
在Safari中:
W3C规范使用"interface"关键字来定义XMLHttpRequest,但实际上并未被使用:
这个 bug 目前只出现在 Safari 7 上(没有测试其他版本)。代码在 Firefox 和 Chrome 中运行良好。修复方法如下:
问题在于假设
XMLHttpRequest
对象的标准类型是什么。我发现不同的引擎会有不同的结果。在Firefox和Chrome中:
typeof XMLHttpRequest //=> "function"
在Safari中:
typeof XMLHttpRequest //=> "object"
W3C规范使用"interface"关键字来定义XMLHttpRequest,但实际上并未被使用:
[Constructor(optional XMLHttpRequestOptions options)]
interface XMLHttpRequest : XMLHttpRequestEventTarget {
// ...
}
MDN定义指出:
XMLHttpRequest是一个JavaScript对象...
但是Firefox返回"function"
,因此该术语至少是模糊的。该定义还指出,目前正在W3C中进行标准化:
它现在正在W3C中标准化。
我已经在这里和那里查看了一些信息,但没有明确的答案™。有吗?
超出这个点,一些额外的背景
问题背景
我刚刚修复了这段代码中的一个错误:
if (typeof XMLHttpRequest === "function") {
// do something
}
这个 bug 目前只出现在 Safari 7 上(没有测试其他版本)。代码在 Firefox 和 Chrome 中运行良好。修复方法如下:
if (typeof XMLHttpRequest !== "undefined") {
// do something
}
问题在于假设
typeof XMLHttpRequest
在任何地方都是相同的...
XMLHttpRequest
,XMLHttpRequest || ActiveXObject
会抛出一个ReferenceError吗? - Alexander O'MaraXMLHttpRequest instanceof Function === false
。我一直认为构造函数必须是一个函数。(已验证,Safari 8.0.6) - Amadanundefined
。 - jfriend00typeof Image
,typeof Location
,typeof History
都是“object”。我不知道它是否相关,但在Safari中,constructor
和__proto__
属性是一个普通的Object
构造函数/实例,而在Firefox中则是一个构造函数。 - Alexander O'Mara