結果はさまざまです:
[object Object]IE6
[object Object]IE8
[object Window]firefox3.6
[object Window]opera10
[object DOMWindow]safai4. 04
[object global]chrome5.0.3.22
Heheming がそれをどのように決定するかを見て、setInterval というプロパティがあるかどうかを確認します。そうですね、あまり厳密ではないようですが、これ以上厳密にすることはできません。一般化された関数が IE の関数であるかどうかを判断することは不可能だからです。 Object.prototype.toString.call は常に [object Object] を出力します。 name 属性はありません。コピーするのが簡単すぎたため、破棄されました。
必死になって、その属性を 1 つずつチェックして、特別な属性があるかどうかを確認します。最後に、無限ループ内でそれ自体を参照する同じ名前のウィンドウ プロパティがあることを発見しました。これは IE では依然として問題です。
]
IE では false が表示され、他のブラウザでは true が表示されます。ただし、すべてのブラウザは次のように統一されています:
外部 Js
]
[Ctrl A すべて選択 注:
外部 Js を導入する必要がある場合は、
]
を実行して、最後に次のコードを取得します。 コードをコピーします。
var isWindow = function(obj){
return obj.window === obj.window.window
}
= ========== ===========ゴージャスな分割線======================
ありがとうインスピレーションを求めてアイヴォニーに!
function isWindow( obj ){
if(typeof obj !== "object") return false;//オブジェクトである必要があります
var Expando = "dom" (new Date-0) //ランダム変数名を生成します
//グローバル解析コード, IE eval は元のスコープに対してのみ有効です
//詳細は http://www.javaeye.com/topic/519098 を参照してください
//また、HTML5 strict モードでは eval と with が禁止されているため、それらを捨ててください!
var js = document.createElement("script");
var head = document.getElementsByTagName("head")[0];
head.insertBefore(js,head.firstChild); js.text = Expando " = {};"
head.removeChild(js)
return window[expando] === obj[expando]
}
isWindow(window)