回答:
オブジェクト自体(プロトタイプチェーンの一部ではない)にあるプロパティをテストする場合は、以下を使用できます.hasOwnProperty()
。
if (x.hasOwnProperty('y')) {
// ......
}
in
演算子を使用して、継承されるプロパティをテストすることもできます。
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
。
オブジェクトに物理的にプロパティが含まれているかどうかを知りたい場合は、@ gnarfの答えを使用hasOwnProperty
するとうまくいきます。
プロパティがオブジェクト自体またはプロトタイプチェーンのどこかに存在するかどうかを知りたい場合は、in
演算子を使用できます。
if ('prop' in obj) {
// ...
}
例えば。:
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Underscore.jsまたはLodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
。配列の場合、私はあなたが欲しいかもしれないと思うArray.prototype.indexOf
、_.indexOf
または_.contains
あなたはこのように少しそれをトリミングすることができます:
if ( x.y !== undefined ) ...
x = {y:undefined}
元のコードの1つの機能
if ( typeof(x.y) != 'undefined' ) ...
状況によっては役立つかもしれませんが、x
存在するかどうかに関係なく使用しても安全です。gnarfの回答のいずれかの方法を使用しx
て、存在するかどうか疑問があるかどうかを最初にテストする必要があります。
したがって、おそらく3つの方法はすべて、トリックの袋に入れられます。
(x && x.hasOwnProperty('y'))
or を使うことができます(x && 'y' in x)
ReferenceError
文字列 'undefined'ではなくaを返します
プロパティチェックの不格好と、関数の引数オプションオブジェクトの検証が通常のユースケースの1つであるという疑問があったため、複数のプロパティの存在をテストするための、ライブラリを使用しない簡単な方法について触れておきます。免責事項:ECMAScript 5が必要です(ただし、まだIE8を使用しているIMOは、壊れたWebに値します)。
function f(opts) {
if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
throw new Error("IllegalArgumentException");
}
alert("ok");
}
f({req1: 123}); // error
f({req1: 123, req2: 456}); // ok
なぜ単純ではないのですか?
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
または、特定のタイプが必要な場合:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
か?
Object.prototype.hasOwnProperty.call(x, 'y')
、「hasOwnProperty」という名前のプロパティが検査プロセスと競合しないようにする;)