プロパティ名を保持する変数を持つオブジェクトプロパティが存在するかどうかを確認するにはどうすればよいですか?


680

問題のプロパティ名を保持する変数を使用して、オブジェクトプロパティの存在を確認しています。

var myObj;
myObj.prop = "exists";
var myProp = "p"+"r"+"o"+"p";

if(myObj.myProp){
    alert("yes, i have that property");
};

これはundefined探してmyObj.myPropいるのでチェックしたいmyObj.prop


2
おそらく役に立つ:NCZOnlineでの Pablo Cabreraのコメントから:「hasOwnPropertyメソッドが上書きされた場合、に依存できることに注意することは価値があると思いますObject.prototype.hasOwnProperty.call(object, property)。」
HumanInDisguise 2015

10
あるstackoverflow.com/questions/4244896/...この質問の重複?どう?「存在をチェックすること」と「価値にアクセスすること」は違うものですか?私が間違っている場合は訂正してください....
adnan2nd

これは重複ではありません。
ジェフクレイトン

回答:


1307
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("yes, i have that property");
}

または

var myProp = 'prop';
if(myProp in myObj){
    alert("yes, i have that property");
}

または

if('prop' in myObj){
    alert("yes, i have that property");
}

hasOwnPropertyは継承したプロパティをチェックしませんが、チェックすることに注意してくださいin。たとえば、'constructor' in myObj本当ですが、そうでmyObj.hasOwnProperty('constructor')はありません。


23
hasOwnProperty()myObj[myProp]の値myPropが0の場合でも機能するため、他の回答よりも優れています
Matt R

9
「in」演算子は文字列では機能しません。たとえば、「qqq」の「length」は例外を生成します。したがって、汎用チェックが必要な場合は、hasOwnPropertyを使用する必要があります。
ジェイコブ

1
@Jacob「in演算子は文字列では機能しない」とはどういう意味ですか?「in」演算子では、左の式は文字列または文字列に変換できる値である必要があります。はい、「qqq」に「length」を書き込むことはできませんが、「qqq」.hasOwnProperty( 'length')も書き込むことはできません
Wachburn

2
@Wachburn:'qqq'.hasOwnProperty('length')true、それを行うことができます。
Rocket Hazmat

1
@ gaurav5430私が言及しているのmyPropは、0の場合、ifステートメントは次のようになり、プロパティがif (myObj[0])ある場合myObj、式はと評価されることtrueです。そしてmyObj[0]、あなたが探している物件ではないかもしれません。
Matt R

51

hasOwnPropertyを使用できますが、参照に基づいて、このメソッドを使用する場合は引用符が必要です。

if (myObj.hasOwnProperty('myProp')) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

もう一つの方法は、使用すること、オペレータが、あなたは必要な引用符をここにも。

if ('myProp' in myObj) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in


6
これは実装方法ではありませんhasOwnProperty()
キヤノン

7
これは誤りです。myPropという名前を引用符で囲むことで、myPropの値を参照するのではなく、myPropの新しいString()を宣言し、myObjにそのようなmyPropのプロパティはありません。
TriumphST 2016年

1
TriumpST:上記のMDNから、「prop-プロパティ名または配列インデックスを表す文字列またはシンボル(非シンボルは文字列に強制変換されます)。」
Ben Creasy 2017年

これは正しいです。変数を使用したくないが、特定の「myProp」が存在する場合は、引用符が必要です。
Katinka Hesselink 2018年

@KatinkaHesselink:あなたのコメントは誤解を招くものです。問題は、「プロパティ名を保持する変数を持つオブジェクトプロパティが存在するかどうかを確認する方法」でした。
Herbert Van-Vliet

26

皆さまのご協力に感謝し、評価ステートメントを取り除くようにお願いします。変数は、ドット表記ではなく、括弧で囲む必要がありました。これは機能し、クリーンで適切なコードです。

これらはそれぞれ変数です:appChoice、underI、underObstr。

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}

これは私には問題のようです。がtData.tonicdata[appChoice]と一致するプロパティ/インデックスを持たない値にunderIなる場合、TypeErrorスローされます。
Ynot

最初の投稿での意図にもかかわらず、実際にこの回答を提供した質問とは異なる質問をしました。プロパティの存在を確認したかったのですが、プロパティへのアクセス方法については何も触れていません。これにより、この回答は実際の質問と無関係になります。
飼料:

18

自分のプロパティの場合:

var loan = { amount: 150 };
if(Object.prototype.hasOwnProperty.call(loan, "amount")) 
{ 
   //will execute
}

注:カスタムhasOwnPropertyがプロトタイプチェーンで定義されている場合(ここでは当てはまりません)、次のようにObject.prototype.hasOwnPropertyを使用することは、loan.hasOwnProperty(..)よりも優れています。

var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

継承されたプロパティを検索結果に含めるには、in演算子を使用します(ただし、オブジェクトを「in」の右側に配置する必要があります。プリミティブ値はエラーをスローします。たとえば 、「home」の「length」はエラーをスローしますが、「length」新しいString( 'home')ではありません)

const yoshi = { skulk: true };
const hattori = { sneak: true };
const kuma = { creep: true };
if ("skulk" in yoshi) 
    console.log("Yoshi can skulk");

if (!("sneak" in yoshi)) 
    console.log("Yoshi cannot sneak");

if (!("creep" in yoshi)) 
    console.log("Yoshi cannot creep");

Object.setPrototypeOf(yoshi, hattori);

if ("sneak" in yoshi)
    console.log("Yoshi can now sneak");
if (!("creep" in hattori))
    console.log("Hattori cannot creep");

Object.setPrototypeOf(hattori, kuma);

if ("creep" in hattori)
    console.log("Hattori can now creep");
if ("creep" in yoshi)
    console.log("Yoshi can also creep");

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

注:typeofおよび[]プロパティアクセサーを次のコードとして使用したくなるかもしれません。 は常に機能するは限りません ...

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // correct
{
    // will execute
}

if(typeof loan["installment"] !== "undefined") // incorrect
{
    // will not execute
}

13

オブジェクトにプロパティが存在するかどうかを確認するより安全な方法は、空のオブジェクトまたはオブジェクトプロトタイプを使用して呼び出すことです hasOwnProperty()

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use the hasOwnProperty property from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

MDN Webドキュメントからの参照-Object.prototype.hasOwnProperty()


4
オーバーライドのような悪を行う可能性のあるJavaScriptを組み込んでいる場合hasOwnProperty、このような保護機能がなくてもコードの安全性は確保されます。
meustrus

@meustrus私はあなたがどこから来たのか知っていますが、ビジネスの観点からは、経験の浅い開発者がこのプロパティ名を使用する可能性が高いです。
skmasq

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.