2009-05-22 21 views
20

私はnewで作成したカスタムJavaScriptオブジェクトを持っている、と創造の引数に基づいてにプロパティを割り当てる:JavaScriptオブジェクトにプロパティが存在するかどうかをテストする正しい方法は何ですか?

function MyObject(argument) { 
    if (argument) { 
     this.prop = "foo"; 
    } 
} 
var objWithProp = new MyObject(true); // objWithProp.prop exists 
var objWithoutProp = new MyObject(false); // objWithoutProp.prop does not exist 

オブジェクトのpropプロパティが存在するかどうかをテストするための正しい方法は何ですか?私が使用し、次の方法を見てきましたが、これらのいずれかの方法が最良の方法である場合、私はよく分からない。具体的に

  • if (obj.prop) {}
  • if (obj.hasOwnProperty("prop")) {}
  • if ("prop" in obj) {}

、私は」プロトタイプチェーンではなく、このオブジェクトに対してプロパティが明示的に定義されているかどうかをテストすることにのみ関心があります。さらに、値はnullまたはundefinedに決して設定されませんが、空のオブジェクトや配列のようなものになる可能性があります。しかし、正しい方法があればそれを含めるには、自由に感じてください。 「プロパティが明示的にこのオブジェクトのために定義されている場合ではないプロトタイプチェーン内に、」指定したので、

答えて

29

hasOwnPropertyは、あなたが探しているまさに何です。 Per https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty "このメソッドは、オブジェクトがそのオブジェクトの直接のプロパティとして指定されたプロパティを持つかどうかを判断するために使用できますが、in演算子とは異なり、このメソッドはオブジェクトのプロトタイプチェーンをチェックしません。 - あなたの要件を正確に一致するようだ!

7

オブジェクトで定義されているプロパティを検索する場合は、オブジェクトのhasOwnPropertyメソッドを使用できます。

myObject = new MyObject(); 
// some code 
if (myObject.hasOwnProperty('prop')) { 
    // prop exists 
} 

しかし、これは、そのようなプロパティがオブジェクト自体に定義されていてもその親ではないかどうかを知るためのものです。そのようなプロパティがオブジェクトによって継承されている場合、このような存在をテストすることはできません。

もう1つの方法は、未定義の値に対してプロパティをテストすることです。このように:!!!

if (myObject.prop !== undefined) { 
    // prop exists 
} 

の代わりに、==演算子を使用することを忘れない=ので= nullとundefined間で異なることはありませんが、==ありません!。オブジェクトにプロパティがあり、その値がnullの場合、!=はあなたを助けません。このテストは

if (myObject.prop) { 
} 

の場合、「prop」にfalseまたはnull値があると間違った結果になる可能性があります。 !==演算子で未定義と比較することで、null/falseの値があなたを混乱させないことが保証されます。

2

次のようにvariableの存在を確認することができます。

if (typeof variable === 'undefined' || variable === null) { 
    // Do stuff 
} 

またpropertiesに使用することができます。

関連する問題