hasOwnProperty
ループが使用されるたびにチェックを使用する必要があると言っているブログがたくさんありますが、for..in
なぜそうなのかわかりません。チェックの有無にかかわらず、同じ結果が得られます。
このフィドルをチェックしてください。
hasOwnProperty
ループが使用されるたびにチェックを使用する必要があると言っているブログがたくさんありますが、for..in
なぜそうなのかわかりません。チェックの有無にかかわらず、同じ結果が得られます。
このフィドルをチェックしてください。
を使用して基本的なオブジェクトを作成する場合{}
、またはを使用してJSONから取得する場合JSON.parse
は、hasOwnProperty
グローバルに使用できません。
ただし、(プロトタイプを使用して)「クラス」を拡張する場合は、「独自のプロパティ」(直接関数を含む直接プロパティ)にアクセスしているかどうかを知るのに役立ちます。
基本オブジェクトには少なくとも1つの(直接ではない)プロパティがあることに注意してください。これは、console.log({});
またはで検出できますconsole.log({}.toString)
が、列挙できず、for... in
ループに表示されません。
for ... inループは、列挙できないプロパティを反復処理しません。ArrayやObjectなどの組み込みコンストラクターから作成されたオブジェクトは、StringのindexOfメソッドやObjectのtoStringメソッドなど、列挙できないObject.prototypeおよびString.prototypeから列挙できないプロパティを継承しています。ループは、オブジェクトのすべての列挙可能なプロパティ、またはコンストラクターのプロトタイプから継承するプロパティ(組み込みのプロパティを上書きするものを含む)を繰り返し処理します。
hasOwnProperty
プロパティがオブジェクトのネイティブプロパティであるか、そのプロトタイプから継承されているかがわからない場合。
var obj1 = {a:"10",b:"20"};
Object.prototype.c = "prototype:30";
var i;
for(i in obj1) {
document.getElementById("div1").innerHTML += obj1[i]+" ";
}
// result 10 20 prototype:30
for(i in obj1) {
if(obj1.hasOwnProperty(i)) {
document.getElementById("div2").innerHTML += obj1[i] +" ";
}
}
// result 10 20
この場合、そのプロトタイプからobj1
プロパティを継承し、最初のループで誤ってリストすることになります。c
Object
多くの場合、 を使用しても使用しなくても同じ結果が得られますhasOwnProperty
が、後者は問題のオブジェクトに直接依存するのではなく、継承されたプロパティを無視します。
この基本的な継承システムを考えてみましょう。犬は、マスター Animal クラスから継承します。
function Animal(params) { this.is_animal = true; }
function Dog(params) { for (var i in params) this[i] = params[i]; }
Dog.prototype = new Animal();
var fido = new Dog({name: 'Fido'});
を覗き込むfido
と、hasOwnProperty
どれが独自のプロパティ (名前) で、どれが継承されているかを確認するのに役立ちます。
for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]);
...アラートですname=Fido
が、そうではありませんis_animal=true
。
これが、 for..in ステートメントで hasOwnProperty() メソッドが必要な理由です。これは役に立たないわけではありません。これは、コードを安全にし、常に正しいことを行うために非常に重要です。一部のライブラリまたは一部の依存関係が Object.prototype に触れる可能性があるためです。 hasOwnProperty チェックを使用しないと、 for...in ステートメントが予期しないキーを反復している可能性があります。したがって、hasOwnProperty() を使用して for...in ステートメントを安全にする必要があります。
var obj = {
a: 1,
b: 2
};
Object.prototype.haha = 3;
for (var k in obj) {
if (obj.hasOwnProperty(k)){
console.log(k); // prints a, b
}
}
var obj = {
a: 1,
b: 2
};
Object.prototype.haha = 3;
for (var k in obj) {
console.log(k); // prints a, b, haha
}