Javascript 为什么是;window.location instanceof location“;在IE中出错?

Javascript 为什么是;window.location instanceof location“;在IE中出错?,javascript,dom,typechecking,Javascript,Dom,Typechecking,我在FF3.6和IE8中测试了以下代码。前者警告true,后者警告false。这是为什么?我如何在两种浏览器中实现相同的行为?谢谢大家! <!DOCTYPE html> <html> <head> <script> alert(window.location instanceof Location); </script> </head> <

我在FF3.6和IE8中测试了以下代码。前者警告
true
,后者警告
false
。这是为什么?我如何在两种浏览器中实现相同的行为?谢谢大家!

<!DOCTYPE html>
<html>
    <head>
        <script>
            alert(window.location instanceof Location);
        </script>
    </head>
    <body>
    </body>
</html>

警报(window.location instanceof location);
在IE和Firefox中工作;在铬合金中不起作用。(Chrome中没有
位置
对象。)但是,只有在脚本运行的同一窗口中测试位置时才起作用

你到底想干什么

在IE和Firefox中工作;在铬合金中不起作用。(Chrome中没有
位置
对象。)但是,只有在脚本运行的同一窗口中测试位置时才起作用


您真正想做什么?

编辑:关于您问题下的注释,听起来您需要测试DOM元素和Location对象之间的差异

使用
nodeType
属性测试DOM元素可能会更好

if( obj.nodeType ) {
    // it was a DOM element
}
如果未找到
节点类型
,则可以测试各种属性,以确定它是
位置
对象

if( obj.nodeType ) {
    // it was a DOM element
} else if( obj.hostname && obj.pathname ) {
    // it was a location object
} else {
    // some ERROR
}

原始答案:

这在Chrome、Safari和Firefox中都适用:

Object.prototype.toString.call(window.location) == '[object Location]';
不过,我现在不能参加IE考试


这是ECMAScript规范中提到的获取内部
[[Class]]
属性名的方法。

编辑:关于您问题下的注释,听起来您需要测试DOM元素和Location对象之间的差异

使用
nodeType
属性测试DOM元素可能会更好

if( obj.nodeType ) {
    // it was a DOM element
}
如果未找到
节点类型
,则可以测试各种属性,以确定它是
位置
对象

if( obj.nodeType ) {
    // it was a DOM element
} else if( obj.hostname && obj.pathname ) {
    // it was a location object
} else {
    // some ERROR
}

原始答案:

这在Chrome、Safari和Firefox中都适用:

Object.prototype.toString.call(window.location) == '[object Location]';
不过,我现在不能参加IE考试


这是ECMAScript规范中提到的获取内部
[[Class]]
属性名的方法。

也许您应该解释一下此检查的目的是什么?我认为这样的内部类名(Location、HtmleElement等)并不是完全在浏览器之间共享的,因此了解您试图做什么来建议替代方案可能会有所帮助。有趣的观察结果:在IE中获取Location对象的构造函数名也会失败。使用中的技术,我正在开发一个jQuery插件,它将URL锚映射到JS函数。插件接受一个参数,该参数可以是DOM元素,也可以是
Location
对象。所以我需要一种方法来检查给定的参数是什么类型的。:)我更新了我的答案。如果是DOM元素,最好测试将出现的
nodeType
属性。如果需要,还可以测试
位置
对象的某些属性。当然,有人可以传入其他具有这些属性的对象,所以它不是绝对完美的。但是,如果有人在使用你的插件,他们似乎不太可能像那样试图击败测试。也许你应该解释一下这个检查的目的是什么?我认为这样的内部类名(Location、HtmleElement等)并不是完全在浏览器之间共享的,因此了解您试图做什么来建议替代方案可能会有所帮助。有趣的观察结果:在IE中获取Location对象的构造函数名也会失败。使用中的技术,我正在开发一个jQuery插件,它将URL锚映射到JS函数。插件接受一个参数,该参数可以是DOM元素,也可以是
Location
对象。所以我需要一种方法来检查给定的参数是什么类型的。:)我更新了我的答案。如果是DOM元素,最好测试将出现的
nodeType
属性。如果需要,还可以测试
位置
对象的某些属性。当然,有人可以传入其他具有这些属性的对象,所以它不是绝对完美的。但是,如果有人正在使用你的插件,他们似乎不太可能试图通过这样的测试来击败测试。在IE中返回
[object object]
:(@Philippe:是的,刚刚完成了测试。如果需要,你可能需要做两个单独的测试,包括从。EDIT:尽管这一个在IE7中似乎失败。返回
IE中的[object object]
:(@Philippe:是的,刚刚也完成了测试。如果需要,您可能需要执行两个单独的测试,包括。EDIT:尽管在IE7中该测试似乎失败。