1

o.propertyIsEnumerable(x)Javascriptコードでメソッドに遭遇しました。私はそれを構成の同義語として理解していx in oます。違いはありますか?もしそうなら、いくつかの実用的な例で、最初の構成をいつ使用するか、2番目の構成をいつ使用するかを示すことができますか?

var o = {};
o.x = 1;
o.y = 2;

if ("x" in o) {
 // some code
}

if (o.propertyIsEnumerable(x)) {
  // some code
}
4

2 に答える 2

3

このような問題を解決する最も簡単な方法は、仕様のアルゴリズムに従うことです。これが私たちに伝えていることですpropertyIsEnumerable

  • descを、引数としてPを渡してOの [[GetOwnProperty]] 内部メソッドを呼び出した結果とします。

  • desc が定義されていない場合は、false を返します。

  • desc .[[Enumerable]]の値を返します。

ご覧のとおり、問題のオブジェクトの[[GetOwnProperty]]内部メソッドが呼び出されます。これは、指定されたプロパティの値をオブジェクト自体から返すだけです(プロトタイプ チェーン内のものからではありません)。

inそれでは、演算子を見てみましょう:

[[HasProperty]] rval の内部メソッドを引数 ToString(lval) で呼び出した結果を返します

そして、[[HasProperty]]内部メソッドを見ると:

プロパティ名PでOの [[GetProperty]] 内部メソッドを呼び出した結果を desc とする

そして、ここで違いを見ることができます。このin演算子[[GetProperty]]は、メソッドの代わりに [ internal method][4] を使用[[GetOwnProperty]]することになります。これは、プロトタイプ チェーンの下にあるオブジェクトのプロパティを見つけることを意味します。

その他の大きな違いは、(メソッドを使用して) オブジェクトに列挙不可能なプロパティを定義できることですObject.defineProperty。列挙不可能なプロパティを定義すると、演算子によって返されますが、メソッドによって返されることinありませんpropertyIsEnumerable違いを示すフィドルを次に示します。

于 2012-10-04T13:57:31.597 に答える
0

これは、プロトタイプ化されたプロパティを考慮し、列挙可能性を考慮しません。

if (x in o)

もう一方はそうではありません。「独自の」プロパティのみを調べます。

if (o.propertyIsEnumerable(x))
于 2012-10-04T13:50:37.067 に答える