In IE.
window === top; // false
window === window.window // false
window == top; // true
window == window.window // true
In FF3.6 & Chrome stable this doesn't happen.
In IE typeof
, .toString
, Object.prototype.toString.call
all return the same for both top
& window
This is related to this.
Can anyone tell me why IE can't do strict equivelance?
Note that circular reference doesn't cause issues in both IE & Chrome.
o = {};
o.o = o;
o === o.o; // true
Turns out
window.window === window.top; // true
window.window === window.self; // true
So it's an issue with getting window
on it's own.
for (var i in window) {
if (window.window[i] !== window[i]) {
console.log(i); // external, frames, clipboardData
}
}
[Edit]
This is just getting stupid now:
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
[Further edit]
turns out that window.frames holds a pointer to the ie debugger. So having the debugger open changes the window
object. I have to do some more testing.
window.frames.location === window.frames.location; // false
window.frames.location == window.frames.location; // true
window.frames.event.boundElements == window.frames.event.boundElements; // false
Not to mention that window.external
just does not play nicely
>>for (var i in window.external) alert(i);
"Object doesn't support this action"
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…