IE8 でオブジェクトの == と === の動きが違う
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ window と self の比較で === だと false になる
◆ == だと true
◆ == だと true
古い IE でサポートしてません画面出すために 古い IE で動かすコードを書いていたのですが == と === の動きが IE8 以前と IE9 以降で違うようです
IE8 でトップフレームのスクリプトでこれを実行します
結果はこうです
両方が false ならまだしも片方だけが true です
オブジェクトに対しては == も === も参照を比較するだけのはずなのに == と === で結果が異なるのがよくわかりません
古い IE ですし IE 独自仕様でしょうか
IE9 以上や Chrome などでは全部 true です
また false になる条件を調べてみると window 以外の window を取得するもの (self など) を一度でも経由すると window とは別物になるようで window と比較すると false になりました
self.window は self を経由してるので window とは違うものとみなされています
self などを経由せず window.window だと window と一緒です
なんでこうなるのかはわかりませんが とりあえず対策には == を使っておけばよさそうです
ただ オブジェクト同士の比較でないときまで == にしてしまうと型変換してしまうので そこには気をつけないといけないです
IE8 でトップフレームのスクリプトでこれを実行します
console.log(self === window)
console.log(self == window)
console.log(parent === window)
console.log(parent == window)
console.log(top === window)
console.log(top == window)
console.log(self == window)
console.log(parent === window)
console.log(parent == window)
console.log(top === window)
console.log(top == window)
結果はこうです
false
true
false
true
false
true
true
false
true
false
true
両方が false ならまだしも片方だけが true です
オブジェクトに対しては == も === も参照を比較するだけのはずなのに == と === で結果が異なるのがよくわかりません
古い IE ですし IE 独自仕様でしょうか
IE9 以上や Chrome などでは全部 true です
また false になる条件を調べてみると window 以外の window を取得するもの (self など) を一度でも経由すると window とは別物になるようで window と比較すると false になりました
self === window.self
// true
self === self.window
// true
window === window.self
// false
window === self.window
// false
// true
self === self.window
// true
window === window.self
// false
window === self.window
// false
self.window は self を経由してるので window とは違うものとみなされています
self などを経由せず window.window だと window と一緒です
なんでこうなるのかはわかりませんが とりあえず対策には == を使っておけばよさそうです
ただ オブジェクト同士の比較でないときまで == にしてしまうと型変換してしまうので そこには気をつけないといけないです