13

for--ループは、プロトタイプチェーン内のinプロパティも含め、オブジェクトのすべての列挙可能なプロパティを通過します。この関数hasOwnPropertyは、プロトタイプチェーンにある列挙可能なプロパティを除外できます。最後に、関数propertyIsEnumerableはオブジェクトの列挙可能なプロパティを識別できます。

したがって、次のスクリプトは何も出力しないはずです。

for(a in window)
    if(window.hasOwnProperty(a) && !window.propertyIsEnumerable(a))
        console.log(a);

ただし、Chromeでは、上記で多くのプロパティ名が出力されます。

なぜfor-inループし、propertyIsEnumerable列挙可能オブジェクトに関して互いに矛盾するのですか?

4

2 に答える 2

3

悲しいことに、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...inObject.getOwnPropertyNames

于 2012-09-15T06:08:22.883 に答える
0

クロムは奇妙です:

for(a in window)
    if(window.hasOwnProperty(a) && window.propertyIsEnumerable(a))
        console.log(a);

chrome では約 30 個のプロパティが表示されますが、他の方法では 450 個です。

于 2012-08-27T17:27:48.430 に答える