JavaScriptでオブジェクトに特定のプロパティがあるかどうかを確認する方法


311

の値に関係なく、オブジェクトにxプロパティが定義されているかどうかをどのように判断できますか?yx.y

私は現在使用しています

if (typeof(x.y) !== 'undefined')

しかし、それは少し不格好なようです。もっと良い方法はありますか?

回答:


584

オブジェクトにはプロパティがあります:

オブジェクト自体(プロトタイプチェーンの一部ではない)にあるプロパティをテストする場合は、以下を使用できます.hasOwnProperty()

if (x.hasOwnProperty('y')) { 
  // ......
}

オブジェクトまたはそのプロトタイプには次のプロパティがあります。

in演算子を使用して、継承されるプロパティをテストすることもできます。

if ('y' in x) {
  // ......
}

23
またはさらに良い— Object.prototype.hasOwnProperty.call(x, 'y')、「hasOwnProperty」という名前のプロパティが検査プロセスと競合しないようにする;)
kangax

4
またはさらに短く— {}.hasOwnProperty.call(x, 'y')
axmrnv


78

オブジェクトに物理的にプロパティが含まれているかどうかを知りたい場合は、@ 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

18

Underscore.jsまたはLodash

if (_.has(x, "y")) ...

:)


いいえ。これはの単なるエイリアスですObject.prototype.hasOwnProperty.call(x, "y")。配列の場合、私はあなたが欲しいかもしれないと思うArray.prototype.indexOf_.indexOfまたは_.contains
nackjicholson

13

あなたはこのように少しそれをトリミングすることができます:

if ( x.y !== undefined ) ...

15
それは失敗するでしょうx = {y:undefined}
ジェームズ

20
「未定義」と「未定義と定義」を区別する必要がある人はいますか?
jpsimons 2009

16
私は時々やる@darkporter;)
MMM

6

元のコードの1つの機能

if ( typeof(x.y) != 'undefined' ) ...

状況によっては役立つかもしれませんが、x存在するかどうかに関係なく使用しても安全です。gnarfの回答のいずれかの方法を使用しxて、存在するかどうか疑問があるかどうかを最初にテストする必要があります。

したがって、おそらく3つの方法はすべて、トリックの袋に入れられます。


あなたはいつでも(x && x.hasOwnProperty('y'))or を使うことができます(x && 'y' in x)
gnarf

私は同意します、xのテストはそれ自体で別のケースであるべきです。エラー報告も改善されます。
B01

それは私には失敗しました。xが未定義の場合、typeof(xy)はReferenceError文字列 'undefined'ではなくaを返します
Craig

1

プロパティチェックの不格好と、関数の引数オプションオブジェクトの検証が通常のユースケースの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

-2

なぜ単純ではないのですか?

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

または、特定のタイプが必要な場合:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");

1
厳密に入力するのではなく、読むのは悪いからです。私はあなたに尋ねなければなりません:なぜ単純にではないのですx.hasOwnProperty('y')か?
Fabian Picone 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.