Risposte:
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')) {
// ......
}
È possibile utilizzare l' inoperatore per verificare anche le proprietà ereditate.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y').
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
Underscore.js o Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y"). Per gli array Penso che si potrebbe desiderare Array.prototype.indexOf, _.indexOfo_.contains
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.
(x && x.hasOwnProperty('y'))o(x && 'y' in x)
ReferenceErrorstringa anziché un 'indefinito'
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
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!");
x.hasOwnProperty('y')?
Object.prototype.hasOwnProperty.call(x, 'y'), in modo che la proprietà denominata "hasOwnProperty" non sia in conflitto con il processo di ispezione;)