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 inoperador 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 hasOwnPropertyhará 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 inoperador .
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, _.indexOfo_.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 xsi 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)
ReferenceErrorcadena 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;)