Come determinare se un oggetto ha una determinata proprietà in JavaScript


311

Come posso determinare se un oggetto xha una proprietà definita y, indipendentemente dal valore di x.y?

Attualmente sto usando

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

ma sembra un po 'goffo. C'è un modo migliore?

Risposte:


584

L'oggetto ha proprietà:

Se stai testando le proprietà che si trovano sull'oggetto stesso (non parte della sua catena di prototipi) puoi usare .hasOwnProperty():

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

L'oggetto o il suo prototipo ha una proprietà:

È possibile utilizzare l' inoperatore per verificare anche le proprietà ereditate.

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

23
O ancora meglio Object.prototype.hasOwnProperty.call(x, 'y'), in modo che la proprietà denominata "hasOwnProperty" non sia in conflitto con il processo di ispezione;)
kangax,

4
O ancora più breve - {}.hasOwnProperty.call(x, 'y').
axmrnv,


78

Se vuoi sapere se l'oggetto contiene fisicamente la risposta della proprietà @ gnarf usando hasOwnPropertyfarà il lavoro.

Se vuoi sapere se la proprietà esiste ovunque, sull'oggetto stesso o nella catena del prototipo, puoi usare l' inoperatore .

if ('prop' in obj) {
  // ...
}

Per esempio.:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically

18

Underscore.js o Lodash

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

:)


No. È solo un alias per Object.prototype.hasOwnProperty.call(x, "y"). Per gli array Penso che si potrebbe desiderare Array.prototype.indexOf, _.indexOfo_.contains
nackjicholson

13

Puoi tagliare un po 'così:

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

15
Ciò fallirebbe conx = {y:undefined}
James,

20
Qualcuno deve distinguere tra "non definito" e "definito per essere indefinito?"
jpsimons,

16
@darkporter lo faccio a volte;)
mmm

6

Una caratteristica del mio codice originale

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

ciò che può essere utile in alcune situazioni è che è sicuro usare se xesiste o no. Con uno dei metodi nella risposta di gnarf, si dovrebbe prima verificare xse esiste qualche dubbio se esiste.

Quindi forse tutti e tre i metodi hanno un posto nella propria borsa di trucchi.


Puoi sempre usare (x && x.hasOwnProperty('y'))o(x && 'y' in x)
gnarf il

Sono d'accordo, il test per x dovrebbe essere un caso separato da solo. Produce anche una migliore segnalazione degli errori.
b01,

Questo è fallito per me. Se x non è definito, typeof (xy) restituisce una ReferenceErrorstringa anziché un 'indefinito'
Craig,

1

Dal momento che la domanda riguardava la confusione del controllo delle proprietà e un caso d'uso regolare per quella che era la convalida degli oggetti delle opzioni dell'argomento della funzione, ho pensato di menzionare un modo breve senza librerie per testare l'esistenza di più proprietà. Dichiarazione di non responsabilità: richiede ECMAScript 5 (ma chiunque IMO continui a utilizzare IE8 merita una rete interrotta).

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

Perché non semplicemente:

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

O se ti aspetti un tipo specifico:

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

1
Perché è male da leggere e non scrivere rigorosamente. Devo chiederti: perché non semplicemente x.hasOwnProperty('y')?
Fabian Picone,
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.