in 演算子と比較して、for in はオブジェクトのプロパティをループするときにプロトタイプ チェーンも走査し、配列の長さプロパティなどの列挙不可能なプロパティを読み取りません。 概要: オブジェクトに特定のプロパティがあるかどうかを検出する場合、このタスクを完了できる唯一のメソッドは hasOwnProperty です。判断のために hasOwnProperty を追加することをお勧めします。これにより、ローカル プロトタイプの拡張によって発生するエラーを効果的に回避できます。
in 演算子と比較すると、for in はオブジェクトのプロパティをループするときにプロトタイプ チェーンもトラバースし、配列の長さプロパティなどの列挙不可能なプロパティを読み取りません。
// Extend Object.prototype
Object.prototype.bar = 1;
var foo = {moo: 2};
for(var i in foo) { // bar と moo を出力します。
}
ループ本体内の特定のプロパティをフィルターする必要がある場合は、Object.prototype の hasOwnProperty メソッドを使用できます。それを完成させてください。
ヒント: for in ループは常にプロトタイプ チェーン全体を走査するため、複数の継承されたオブジェクトを走査する場合は効率が低くなります。
hasOwnProperty を使用してフィルタリングします
// 上記の例でも foo オブジェクトをターゲットにしています
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i); 🎜>}
}
この例では、hasOwnProperty が使用されているため、最終的に moo が出力されます。hasOwnProperty が無視された場合、コードは、ローカル プロトタイプ ( Object.prototype として) が拡張されました。
Prototype フレームワークは、JavaScript の独自オブジェクトを拡張したクラス ライブラリであり、広く使用されていますが、このフレームワークを導入すると、フィルタリングと判定に hasOwnProperty を使用しないと、出力結果が次のようになります。あなたが望むものではないことは保証されています。
ベスト プラクティス
実行時の判断には常に hasOwnProperty を使用することをお勧めします。実行中のコード環境が汚染されているかどうかは誰も保証できません。
hasOwnProperty
オブジェクトにプロトタイプ チェーンにないカスタム プロパティがあるかどうかを確認するには、どのオブジェクトにもこのメソッドがあり、Object.prototype から継承されます。 。
ヒント: プロパティは存在する可能性がありますが、その値は未定義であるため、プロパティが未定義であるかどうかを完全に検出することはできません。 hasOwnProperty は、プロトタイプ チェーンを通過せずにオブジェクト プロパティを処理できる Javascript の唯一のメソッドです。
// Extend Object.prototype
Object.prototype.bar = 1;
var foo = {goo: unknown};
foo.bar; // 1
'bar' in foo; >
foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true
hasOwnProperty のみが正しい結果を返します, これは、オブジェクトのプロパティを反復処理するときに必要です。オブジェクトのプロトタイプ チェーンで定義されたプロパティを除外する他の方法はありません。
プロパティとしての hasOwnProperty
JavaScript は hasOwnProperty をキーワードまたは予約語として保護しないため、オブジェクトに同じ名前のプロパティがある場合は、拡張された hasOwnProperty を使用して取得する必要があります。正しい結果。
hasOwnProperty: function() {
return false;
},
bar: 'Here be Dragons'
} // 常に false を返します。
// 別の hasOwnProperty を使用して呼び出し、これを foo に設定します
{}.hasOwnProperty.call(foo, 'bar') // true
概要 オブジェクトが特定のプロパティを持っているかどうかを検出する場合、このタスクを完了できる唯一のメソッドは hasOwnProperty です。これにより、ローカル プロトタイプの拡張によって発生するエラーを効果的に回避できるため、判定のために hasOwnProperty を追加することをお勧めします。