4

hasOwnProperty不要な場合は?

JavaScript: The Good Partsには、「通常は必要である」と記載されている次の内容が含まれています。

もう 1 つの形式 ( と呼ばれるfor in) は、オブジェクトのプロパティ名 (またはキー) を列挙します。各反復で、オブジェクトの別のプロパティ名文字列が変数に割り当てられ ます。

通常、objectをテストする必要があります。hasOwnProperty(変数)を使用して、プロパティ名が本当にオブジェクトのメンバーであるか、または代わりにプロトタイプ チェーンで見つかったかを判断します。

for (myvar in obj) {
 if (obj.hasOwnProperty(myvar)) {
 ...
 }
}

より具体的には、単純な辞書のようなオブジェクトのプロパティを列挙したいと思います。これは、Javasacript オブジェクト リテラル構文を使用して作成されます。次に例を示します。

var foo = { 'bar': 'baz' };

または以下を使用して作成された同様のオブジェクトJSON.parse:

var foo = JSON.parse("{ 'bar': 'baz' }");

オブジェクトに対してhasOwnProperty行うときに使用する必要for inがありますか?foo

この JavaScript が、複雑な Web ページの一部としてランダムなブラウザーで実行されているとします。

答えは、「実際には、おそらく/通常は必要ありません。理論的には、一部のフレームワークまたはライブラリObject.prototypeが変更によってプロパティを追加した場合に必要になる可能性がありますObject.prototypeが、そのように変更することは、立派なフレームワークが行う可能性が低い侵入的な悪い習慣になります。 "?

4

3 に答える 3

4

私見ですが、最新の JS インタープリターでは、ほとんど [*] 必要ありません。特に、辞書として使用されている単純なオブジェクトの場合はそうではありません。

jQuery はそれがなくても問題なく動作します。これは、列挙可能なプロパティを危険にさらして に追加することObject.prototypeは悪い考えであることを人々が知っているためです。

もちろん、ES5 では、本当に必要な場合は、 を使用して、列挙不可能なプロパティをに追加できます。Object.prototypeObject.defineProperty

[*] 上記の例外は、特にプロトタイプ チェーンを調べるコードを記述しており、列挙可能なプロパティが継承されているかどうかを本当に知る必要がある場合です。

于 2017-01-09T00:06:57.280 に答える
3

hasOwnProperty「健全で現代的な環境」でプレーンオブジェクト2を反復する場合は必要ありません1 : この仮定は、レガシーブラウザーのサポートを制限することを意味します。

すべての標準Objectプロパティは非常に長い間列挙不可能であり、新しいコア メソッドは常に列挙不可能でした。


1コードが に追加することを決定した場合Object.prototype、これはポリフィルを除いて十分に疑わしいものであり、列挙不可能なプロパティとして追加する必要があります。新しい列挙可能なプロパティを追加すると、「健全な環境」の制約に違反します。IE 9+ (および FF/Chrome/Safari など)Object.definePropertyは、このタスクを十分にサポートします。IE 8 は、「モダンな」制約にも違反しておらず、違反しています。

2配列はプレーンなオブジェクトとは見なされません。また、ほとんどの配列反復では、使用for..inはお勧めできません。

于 2017-01-09T00:25:24.677 に答える