在IE中。
window === top; // false
window === window.window // false
window == top; // true
window == window.window // true
在FF3.6& Chrome稳定不会发生这种情况。
在IE typeof
中,.toString
,Object.prototype.toString.call
对top
和window
都返回相同的内容。 o = {};
o.o = o;
o === o.o; // true
这与this。
有关谁能告诉我为什么IE不能做严格的平等?
请注意,循环引用不会导致IE和&铬。
window.window === window.top; // true
window.window === window.self; // true
结果
window
因此,将for (var i in window) {
if (window.window[i] !== window[i]) {
console.log(i); // external, frames, clipboardData
}
}
置于其自身是一个问题。
window.frames === window.frames; // false
window.frames == window.frames; // false
window.external == window.external; // true
window.external === window.external; // false
window.clipboardData === window.clipboardData; // false
window.clipboardData == window.clipboardData; // false
[编辑]
现在这只是变得愚蠢:
window
[进一步编辑]
结果是window.frames保存了一个指向ie调试器的指针。因此,打开调试器会更改window.frames.location === window.frames.location; // false
window.frames.location == window.frames.location; // true
window.frames.event.boundElements == window.frames.event.boundElements; // false
对象。我必须做更多的测试。
window.external
更不用说>>for (var i in window.external) alert(i);
"Object doesn't support this action"
不能很好地发挥
{{1}}
答案 0 :(得分:13)
这不是一个错误:主机对象可以做任何他们喜欢的事情,window
对象是一个特别复杂的野兽,服务于作为代表浏览器窗口的对象的双重目的,也是一个全局对象的别名。我会把这个作为一个奇怪的东西,并且在比较===
对象时避免使用严格的Window
运算符。
请注意,这不是“JavaScript很奇怪”的耸肩。除了作为全局对象之外,window
是一个宿主对象,并且HTML5之前可以合法地(根据规范,至少)表现出它喜欢的行为。较早版本的IE利用了这种自由,并表现出许多古怪的行为,没有任何规范。试图在不访问源代码的情况下理解它是一个毫无意义的练习。
答案 1 :(得分:4)
对于遇到此问题并需要解决方案的任何人:
我在开发Facebook应用时遇到了这个问题。我想确保应用已加载到Canvas页面iframe中,但在Internet Explorer window === top
中始终返回false。
此:
window.top === window.self
应该适用于IE(和其他浏览器)的所有版本。它非常适合确定你是否被诬陷,它是一个快乐,结构良好的JS,它不会让你感到肮脏。它在iframe内部工作,也没有抛出任何安全警告。
答案 2 :(得分:3)
wtfjs是我最喜欢的网站之一,你可以在Javascript中找到真正古怪的怪物。
不出所料,这个小小的IE功能已被提及,并尝试解释:http://wtfjs.com/2010/02/25/ie-scope
这个解释是否准确,我不能说,但之前已经注意到了效果。
所以是的,IE的DOM中可能有一个怪癖。
但它不会是IE中唯一的怪癖,它让我感到不那么重要。事实上,说实话,为什么这甚至很重要?除了嘲笑IE的费用之外,想要在真实世界的脚本中比较window === top
的用例是什么?
答案 3 :(得分:-3)
window
往往是全局对象,而不是页面。 window.window
将是该全局对象的一个属性,称为“窗口”,所以理论上它们永远不应该相同(===
)但可能类似(==
),因为该全局对象位于全球范围。
我没有对此进行测试,但作为猜测,您可能会比较self
(当前页面)和parent