Come verificare se esiste una proprietà oggetto con una variabile che contiene il nome della proprietà?


681

Sto verificando l'esistenza di una proprietà dell'oggetto con una variabile che contiene il nome della proprietà in questione.

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

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

Questo undefinedperché è alla ricerca, myObj.myPropma voglio che controllimyObj.prop


2
Forse utile: da un commento di Pablo Cabrera alla NCZOnline : "Penso che valga la pena notare che se il hasOwnPropertymetodo viene sovrascritto, puoi fare affidamento sul Object.prototype.hasOwnProperty.call(object, property)."
HumanInDisguise,

10
stackoverflow.com/questions/4244896/… è un duplicato di questa domanda? come va? "controllare l'esistenza" e "accedere al valore" sono cose diverse? Per favore, correggimi se sbaglio ....
adnan2,

questo non è un duplicato.
Jeff Clayton,

Risposte:


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

O

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

O

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

Nota che hasOwnPropertynon controlla le proprietà ereditate, invece in. Ad esempio 'constructor' in myObjè vero, ma myObj.hasOwnProperty('constructor')non lo è.


23
hasOwnProperty()è meglio quindi myObj[myProp](dalle altre risposte) in quanto funziona anche se il valore di myPropè 0
Matt R

9
L'operatore "in" non funziona con le stringhe. ad esempio 'lunghezza' in 'qqq' produrrà un'eccezione. Quindi, se si desidera un controllo generico, è necessario utilizzare hasOwnProperty.
Jacob,

1
@Jacob cosa intendi quando dici 'L'operatore "in" non funziona con le stringhe'? con l'operatore "in" 'l'espressione sinistra deve essere una stringa o un valore che può essere convertito in una stringa. Sì, non puoi scrivere 'lunghezza' in 'qqq' ma non puoi scrivere 'qqq'.hasOwnProperty (' lunghezza ')
Wachburn

2
@Wachburn: 'qqq'.hasOwnProperty('length')è true, puoi farlo.
Rocket Hazmat,

1
@ gaurav5430 Credo che ciò a cui mi riferisco sia che se myPropè 0, l'istruzione if sarebbe simile alla if (myObj[0])quale se myObjavesse delle proprietà, l'espressione valuterà true. E myObj[0]potrebbe non essere la proprietà che stai cercando.
Matt R,

52

È possibile utilizzare hasOwnProperty , ma in base al riferimento sono necessarie le virgolette quando si utilizza questo metodo:

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

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

Un altro modo è quello di utilizzare in operatore, ma è necessario anche virgolette qui:

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

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


6
Cioè , non come hasOwnProperty()è implementata.
canone

7
Questo non è corretto Inserendo le virgolette attorno al nome myProp, non si fa più riferimento al valore di myProp, ma piuttosto si dichiara una nuova stringa () di 'myProp' e non esiste tale proprietà di 'myProp' in myObj.
TriumphST,

1
TriumpST: da MDN collegato sopra, "prop - Una stringa o un simbolo che rappresenta un nome di proprietà o un indice di array (i non simboli saranno costretti a stringhe)."
Ben Creasy,

Questo è corretto. Se non vuoi usare una variabile, ma solo se è presente un 'myProp' specifico, hai bisogno delle virgolette.
Katinka Hesselink,

@KatinkaHesselink: il tuo commento è fuorviante. La domanda era "Come verificare se esiste una proprietà oggetto con una variabile che contiene il nome della proprietà?"
Herbert Van-Vliet,

26

Grazie per l'assistenza di tutti e spingendo per sbarazzarsi della dichiarazione di valutazione. Le variabili dovevano essere tra parentesi, non con la notazione a punti. Funziona ed è pulito, codice corretto.

Ognuna di queste sono variabili: appChoice, underI, underObstr.

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

Questo mi sembra un problema. Se il tData.tonicdata[appChoice]risultato è un valore che non ha una proprietà / indice corrispondente underI, ciò si tradurrà in un TypeErrorlancio.
Ynot,

Nonostante le tue intenzioni con il tuo post iniziale, in realtà hai posto una domanda diversa da quella per cui hai fornito questa risposta. Volevi verificare l'esistenza di una proprietà, non menzioni nulla su come accedervi. Il che rende questa risposta indipendente dalla domanda reale.
Foraggio

19

Per la propria proprietà:

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

Nota: l'utilizzo di Object.prototype.hasOwnProperty è meglio di loan.hasOwnProperty (..), nel caso in cui hasOwnProperty personalizzato sia definito nella catena di prototipi (che qui non è il caso), come

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

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

Per includere le proprietà ereditate nel ritrovamento utilizzare il in operator: (ma è necessario posizionare un oggetto sul lato destro di 'in', i valori primitivi getteranno errore, ad esempio 'lunghezza' a 'casa' getteranno errore, ma 'lunghezza' nella nuova stringa ('home') non lo farà)

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

Nota: si può essere tentati di usare typeof e [] accessor delle proprietà come il seguente codice che non funziona sempre ...

var loan = { amount: 150 };

loan.installment = undefined;

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

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

13

Un modo molto più sicuro per verificare se esiste proprietà sull'oggetto consiste nell'utilizzare un oggetto vuoto o un prototipo di oggetto da chiamare 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

Riferimento da MDN Web Docs - Object.prototype.hasOwnProperty ()


4
Se stai incorporando JavaScript che potrebbe fare qualcosa di malvagio come l'override hasOwnProperty, nessuna quantità di guardie come questa renderà il tuo codice sicuro o protetto.
Meustrus

@meustrus So da dove vieni, ma dal punto di vista aziendale è altamente possibile ricevere che uno sviluppatore inesperto userebbe questo nome di proprietà, il che non significa necessariamente che stiano facendo qualcosa di malvagio intenzionalmente.
skmasq,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.