IE Bug(窗口===顶部)=== false

Ray*_*nos 13 javascript internet-explorer

在IE中.

window === top; // false
window === window.window // false
window == top; // true
window == window.window // true
Run Code Online (Sandbox Code Playgroud)

在FF3.6和Chrome稳定版中,这种情况不会发生.

在IE中typeof,.toString,Object.prototype.toString.call都返回相同的两个top&window

这是关系到这个.

谁能告诉我为什么IE不能做严格的平等?

请注意,循环引用不会导致IE和Chrome出现问题.

o = {};
o.o = o;
o === o.o; // true
Run Code Online (Sandbox Code Playgroud)

结果

window.window === window.top; // true
window.window === window.self; // true
Run Code Online (Sandbox Code Playgroud)

所以这window是自己的问题.

for (var i in window) {
    if (window.window[i] !== window[i]) {
        console.log(i); // external, frames, clipboardData
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑]

这只是现在变得愚蠢:

 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
Run Code Online (Sandbox Code Playgroud)

[进一步编辑]

事实证明,window.frames拥有一个指向ie调试器的指针.因此打开调试器会更改window对象.我还要做一些测试.

window.frames.location === window.frames.location; // false
window.frames.location == window.frames.location; // true
window.frames.event.boundElements == window.frames.event.boundElements; // false
Run Code Online (Sandbox Code Playgroud)

更不用说window.external只是不好玩

>>for (var i in window.external) alert(i);
"Object doesn't support this action"
Run Code Online (Sandbox Code Playgroud)

Tim*_*own 13

这不是一个错误:主机对象可以做任何他们喜欢的事情,并且该window对象是一个特别复杂的野兽,服务于作为代表浏览器窗口的对象的双重目的,并且也是全局对象的别名.我将这个作为一个奇怪的白垩,并避免===在比较Window对象时使用严格的运算符.

请注意,这不是"JavaScript很奇怪"的耸肩.除了作为全局对象之外,window还有一个主机对象,并且HTML5之前可以合法地(至少根据规范)表现出它喜欢的行为.较早版本的IE利用了这种自由,并表现出许多古怪的行为,没有任何规范.试图在不访问源代码的情况下理解它是一个毫无意义的练习.