for..in
ループを使用するたびにhasOwnProperty
チェックを使用する必要があるとのブログがたくさんありますが、その理由はわかりません。チェックの有無にかかわらず、同じ結果が得られます。for..inステートメントでhasOwnPropertyを使用する必要があります
チェックアウトthis fiddle
for..in
ループを使用するたびにhasOwnProperty
チェックを使用する必要があるとのブログがたくさんありますが、その理由はわかりません。チェックの有無にかかわらず、同じ結果が得られます。for..inステートメントでhasOwnPropertyを使用する必要があります
チェックアウトthis fiddle
基本オブジェクトを{}
で作成する場合、または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が継承されます。ループは、オブジェクトのすべての の列挙可能なプロパティに対して繰り返し、またはコンストラクタのプロトタイプ (組み込みの プロパティを上書きするオブジェクトを含む)から継承します。
'hasOwnProperty'はコードを完全に制御できないときには役に立たず、必要ありません。あなたのページ。 Cristophの答えのように、誰かが 'Object.prototype'を修正したとします。単純なオブジェクトであっても、 'hasOwnProperty'がなければ予期しない結果が得られます。 – Radu
あなたが完全にコントロールできないコードを混乱させるのは、{}で基本的なオブジェクトを作成すること、またはJSONから取得することとは異なるカテゴリです* –
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
はプロトタイプ
Object
だとあなたが誤ってあなたの最初のループでそれをリストし、それから、プロパティc
を継承します。
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
に警告します。
これをチェックしてください。http://jsfiddle.net/gFmXM/1/ – goat
@ rambocoder-ありがとう、今すぐ取得します –