悲しいことに、JavaScript エンジンは同じではありません。ES5準拠のエンジンは、プロパティの列挙可能性を忠実に尊重しますwindow
が、上記のpimvdbとFelixが指摘したように、ホストオブジェクトであり、ES5のルールには従いません。
どのwindow
オブジェクトが実際に にあるかの証拠をさらに確認できますwindow.constructor
。これは、それがから構築されていることを示します
function Window() { [native code] }
そのため、なぜ特定のプロパティが (Chrome に従って) 列挙可能であり、他のプロパティが JavaScript ランタイム内からのものではないかを判断する実際の方法はありません。
ただし、Chrome の一貫性のないwindow
列挙可能なプロパティの完全な状態は、MDN の記事Object.keys(window)
によると、「特定のオブジェクトで見つかったすべての独自の列挙可能なプロパティの配列を返す」を参照することで確認できます。
そうしても、30 個の奇数のプロパティの配列が返されます。それをChromeの奇妙さにチョークで書きましょう!
編集: さらにテストを行った結果、Chrome が towindow
の列挙可能なプロパティを理解するための適切な方法を見つけました。
Object.keys(window).filter(function(prop) {
return window.hasOwnProperty(prop) && !window.propertyIsEnumerable(prop);
});
Chrome では、 によって列挙されるプロパティの候補リストはfor...in
によって返されるものではないように見えますObject.keys
が、実際には、Object.getOwnPropertyNames
列挙可能なプロパティと列挙できないプロパティをリストするリストにはるかに近いものです。しかし、それでも矛盾しています。私のテストでは、それぞれとwindow.hasOwnProperty(prop) && !window.propertyIsEnumerable(prop)
の 423 と 454 に出てくるプロパティのリスト。for...in
Object.getOwnPropertyNames