私は別の開発者とhasOwnPropertyについて話していましたが、JavaScriptのfor-inループでどのように使用するのかについて話していましたが、彼は良い質問をしました。for-inループを実行すると、toString、hasOwnProperty、およびその他の組み込みメソッドがループに表示されないのはなぜですか?
5 に答える
ECMAScriptは、プロトタイプなどのオブジェクトにあるプロパティごとにいくつかのプロパティを定義します。これらの1つはenumerable
プロパティであり、に設定されている場合false
、そのプロパティはスキップされます。
これらのプロパティは、次のdefineProperty
関数を使用して実際に操作できます。
このメソッドを使用すると、オブジェクトのプロパティを正確に追加または変更できます。割り当てによる通常のプロパティの追加により、プロパティの列挙中に表示されるプロパティが作成されます(for ... in loop)。その値は変更される可能性があり、削除される可能性があります。この方法では、これらの追加の詳細をデフォルトから変更できます。
仕様通りです
for ... inループは、組み込みプロパティを反復処理しません。これらには、StringのindexOfメソッドやObjectのtoStringメソッドなど、オブジェクトのすべての組み込みメソッドが含まれます。ただし、ループはすべてのユーザー定義プロパティ(組み込みプロパティを上書きするプロパティを含む)を繰り返し処理します。
for..inのMozillaDeveloperNetworkページから
これは、 EcmaScript仕様で確認できるように、これらのプロパティの列挙可能な属性に内部的に基づいています(「for-in」を検索すると、「enumerable」属性については30ページで説明されています)。
toString
したがって、組み込みプロパティは列挙できず、列挙hasOwnProperty
できません。ECMAScript 3では、すべてのユーザー定義のメソッドまたはプロパティを列挙できます。ECMAScript 5では、メソッドまたはプロパティを列挙可能にするかどうかを選択できます。
おそらく私はあなたの質問を誤解していますが、for-inループ内から動作するhasOwnPropertyの例を次に示します。
var i,o={some:"thing"};for(i in o)alert(o.hasOwnProperty("some"));