Respuestas:
Si está probando propiedades que se encuentran en el objeto en sí (no forma parte de su cadena de prototipos), puede usar .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
Puede usar el in
operador para probar las propiedades que también se heredan.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
Si desea saber si el objeto contiene físicamente la propiedad, la respuesta de @ gnarf usando hasOwnProperty
hará el trabajo.
Si desea saber si la propiedad existe en algún lugar, ya sea en el objeto mismo o en la cadena de prototipos, puede usar el in
operador .
if ('prop' in obj) {
// ...
}
P.ej.:
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")
. Para las matrices Creo que es posible que desee Array.prototype.indexOf
, _.indexOf
o_.contains
Una característica de mi código original
if ( typeof(x.y) != 'undefined' ) ...
lo que puede ser útil en algunas situaciones es que es seguro usar si x
exista o no. Con cualquiera de los métodos en la respuesta de gnarf, primero se debe verificar x
si hay alguna duda de si existe.
Entonces, quizás los tres métodos tienen un lugar en la bolsa de trucos.
(x && x.hasOwnProperty('y'))
o(x && 'y' in x)
ReferenceError
cadena en lugar de la cadena 'undefined'
Dado que la pregunta se refería a la complejidad de la comprobación de propiedades, y un caso de uso regular para eso es la validación de los objetos de opciones de argumentos de función, pensé que mencionaría una forma corta y libre de biblioteca de probar la existencia de múltiples propiedades. Descargo de responsabilidad: requiere ECMAScript 5 (pero IMO cualquiera que todavía use IE8 merece una web rota).
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
Por qué no simplemente:
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
O si espera un tipo específico:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
, para que la propiedad llamada "hasOwnProperty" no entre en conflicto con el proceso de inspección;)