7

私は別の開発者とhasOwnPropertyについて話していましたが、JavaScriptのfor-inループでどのように使用するのかについて話していましたが、彼は良い質問をしました。for-inループを実行すると、toString、hasOwnProperty、およびその他の組み込みメソッドがループに表示されないのはなぜですか?

4

5 に答える 5

5

ECMAScriptは、プロトタイプなどのオブジェクトにあるプロパティごとにいくつかのプロパティを定義します。これらの1つはenumerableプロパティであり、に設定されている場合false、そのプロパティはスキップされます。

これらのプロパティは、次のdefineProperty関数を使用して実際に操作できます。

このメソッドを使用すると、オブジェクトのプロパティを正確に追加または変更できます。割り当てによる通常のプロパティの追加により、プロパティの列挙中に表示されるプロパティが作成されます(for ... in loop)。その値は変更される可能性があり、削除される可能性があります。この方法では、これらの追加の詳細をデフォルトから変更できます。

于 2011-05-27T17:42:29.093 に答える
4

仕様通りです

for ... inループは、組み込みプロパティを反復処理しません。これらには、StringのindexOfメソッドやObjectのtoStringメソッドなど、オブジェクトのすべての組み込みメソッドが含まれます。ただし、ループはすべてのユーザー定義プロパティ(組み込みプロパティを上書きするプロパティを含む)を繰り返し処理します。

for..inのMozillaDeveloperNetworkページから

これは、 EcmaScript仕様で確認できるように、これらのプロパティの列挙可能な属性に内部的に基づいています(「for-in」を検索すると、「enumerable」属性については30ページで説明されています)。

于 2011-05-27T17:40:02.737 に答える
4

これらのメソッドには内部[[Enumerable]]属性が設定されていると確信していますfalseが、これが明示的に指定されている場所は見つかりません。

更新:明らかに、列挙できないことは、仕様で定義されているプロパティのデフォルト設定です(特に指定されていない場合)(以下のリンクの表7を参照)。

これらの属性の詳細については、仕様を参照してください。プロパティ属性

の場合true、プロパティはfor-in列挙によって列挙されます(12.6.4を参照)。それ以外の場合、プロパティは列挙できないと言われます。

于 2011-05-27T17:42:36.390 に答える
1

toStringしたがって、組み込みプロパティは列挙できず、列挙hasOwnPropertyできません。ECMAScript 3では、すべてのユーザー定義のメソッドまたはプロパティを列挙できます。ECMAScript 5では、メソッドまたはプロパティを列挙可能にするかどうかを選択できます。

于 2011-05-27T17:46:14.443 に答える
0

おそらく私はあなたの質問を誤解していますが、for-inループ内から動作するhasOwnPropertyの例を次に示します。

var i,o={some:"thing"};for(i in o)alert(o.hasOwnProperty("some"));
于 2011-05-27T17:39:35.360 に答える