Questo non è tutto, window!==window.window
!
Credo che quello che probabilmente stiamo vedendo qui è la differenza tra gli oggetti "finestra interna" e "finestra esterna". Certamente altri browser hanno questi (ad esempio Moz); in genere vengono utilizzati per presentare una vista diversa di window
all'interno e all'esterno del proprio codice.
La finestra interna contiene le variabili globali e i membri specifici del documento. La finestra esterna è accessibile allo script [cross-frame-] tramite riferimenti di finestra come frames[n]
, parent
, opener
e apparentemente self
. È associato alla finestra del proprietario (finestra del browser/frame), quindi ad es. quando si sposta un iframe in un nuovo documento, il documento principale vede ancora l'oggetto identico window
nel suo iframe.
In un design ragionevole del modello di oggetto del browser ci sarebbero oggetti separati per questo, ma quando JavaScript è stato originariamente gettato insieme da Netscape ci sono state pochissime considerazioni sull'eleganza, risultando in questa e molte altre interfacce dove c'è troppo sovraccarico (form
con un elemento chiamato submit
, qualcuno?).
Quindi per la compatibilità, la finestra divisa deve continuare per apparire come un singolo oggetto per gli script anche se non è sotto. In IE, a volte la maschera scivola: sembra come dire che window
ti porta la finestra interna, e non c'è trucco per renderlo ===
contro la finestra esterna.
ETA: In realtà ci penso, c'è anche qualche (scarsa) giustificazione per questo. La specifica ECMAScript, che non è scritta con più contesti globali in mente, definisce window
e la versione non associata di this
, come il recupero dell'oggetto della variabile globale, che sarebbe la finestra interna.
Le altre proprietà, che fanno parte del DOM/BOM, non rientrano nello scopo delle specifiche ECMA, quindi possono restituire qualcosa di diverso (e, per motivi di script cross-frame).
Interessanti a quanto pare non sono dello stesso tipo. window.self.self === window.self equivale al vero pensiero. Apparentemente IE considera la finestra come un tipo speciale. –
perché IE fa tutto sbagliato. :-) –