13

hasOwnPropertyループが使用されるたびにチェックを使用する必要があると言っているブログがたくさんありますが、for..inなぜそうなのかわかりません。チェックの有無にかかわらず、同じ結果が得られます。

このフィドルをチェックしてください。

4

4 に答える 4

16

を使用して基本的なオブジェクトを作成する場合{}、またはを使用してJSONから取得する場合JSON.parseは、hasOwnPropertyグローバルに使用できません。

ただし、(プロトタイプを使用して)「クラス」を拡張する場合は、「独自のプロパティ」(直接関数を含む直接プロパティ)にアクセスしているかどうかを知るのに役立ちます。

基本オブジェクトには少なくとも1つの(直接ではない)プロパティがあることに注意してください。これは、console.log({});またはで検出できますconsole.log({}.toString)が、列挙できずfor... inループに表示されません。

for ... inループは、列挙できないプロパティを反復処理しません。ArrayやObjectなどの組み込みコンストラクターから作成されたオブジェクトは、StringのindexOfメソッドやObjectのtoStringメソッドなど、列挙できないObject.prototypeおよびString.prototypeから列挙できないプロパティを継承しています。ループは、オブジェクトのすべての列挙可能なプロパティ、またはコンストラクターのプロトタイプから継承するプロパティ(組み込みのプロパティを上書きするものを含む)を繰り返し処理します。

于 2012-07-03T15:18:38.230 に答える
12

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プロパティを継承し、最初のループで誤ってリストすることになります。cObject

于 2012-07-03T15:25:22.703 に答える
1

多くの場合、 を使用しても使用しなくても同じ結果が得られます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

于 2012-07-03T15:29:55.347 に答える
0

これが、 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
}

于 2021-05-23T16:59:55.377 に答える