2012-07-03 11 views
9

for..inループを使用するたびにhasOwnPropertyチェックを使用する必要があるとのブログがたくさんありますが、その理由はわかりません。チェックの有無にかかわらず、同じ結果が得られます。for..inステートメントでhasOwnPropertyを使用する必要があります

チェックアウトthis fiddle

+1

これをチェックしてください。http://jsfiddle.net/gFmXM/1/ – goat

+0

@ rambocoder-ありがとう、今すぐ取得します –

答えて

11

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

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

A:基本的なオブジェクトは、あなたがfor... inループにconsole.log({});またはconsole.log({}.toString)しかしit's not enumerable and not seenで発見ことが、少なくとも一つの(ない指揮)性質を持っていることを

注意非列挙型プロパティに対して ArrayやObjectなどの組み込みコンストラクタで作成されたオブジェクトには、Object.prototypeの列挙できないプロパティや、文字列のindexOf メソッドやObjectのtoStringメソッドなど、列挙できない String.prototypeが継承されます。ループは、オブジェクトのすべての の列挙可能なプロパティに対して繰り返し、またはコンストラクタのプロトタイプ (組み込みの プロパティを上書きするオブジェクトを含む)から継承します。

+2

'hasOwnProperty'はコードを完全に制御できないときには役に立たず、必要ありません。あなたのページ。 Cristophの答えのように、誰かが 'Object.prototype'を修正したとします。単純なオブジェクトであっても、 'hasOwnProperty'がなければ予期しない結果が得られます。 – Radu

+0

あなたが完全にコントロールできないコードを混乱させるのは、{}で基本的なオブジェクトを作成すること、またはJSONから取得することとは異なるカテゴリです* –

10

hasOwnPropertyを指定しないと、プロパティがオブジェクトのネイティブプロパティであるか、プロトタイプから継承されているかわかりません。この場合obj1

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 
​ 

Your modified fiddle

はプロトタイプObjectだとあなたが誤ってあなたの最初のループでそれをリストし、それから、プロパティcを継承します。

1

hasOwnPropertyの有無にかかわらず同じ結果が得られることがよくありますが、後者は問題のオブジェクトに直接影響することなく継承されたプロパティを無視します。

この基本的な継承システムについて考えてみましょう。犬はマスター動物クラスから継承します。我々はfidoを覗き場合

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'}); 

hasOwnPropertyは、私たちは独自のプロパティ(名前)と継承されている確かめることができます。

for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]); 

は... name=Fidoなくis_animal=trueに警告します。

関連する問題