Cómo determinar si un objeto tiene una propiedad dada en JavaScript


311

¿Cómo puedo determinar si un objeto xtiene una propiedad definida y, independientemente del valor de x.y?

Actualmente estoy usando

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

pero eso parece un poco torpe. ¿Hay una mejor manera?

Respuestas:


584

El objeto tiene propiedad:

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')) { 
  // ......
}

El objeto o su prototipo tiene una propiedad:

Puede usar el inoperador para probar las propiedades que también se heredan.

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

23
O mejor aún Object.prototype.hasOwnProperty.call(x, 'y'), para que la propiedad llamada "hasOwnProperty" no entre en conflicto con el proceso de inspección;)
kangax

44
O incluso más corto - {}.hasOwnProperty.call(x, 'y').
axmrnv


78

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

18

Underscore.js o Lodash

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

:)


No Es solo un alias para Object.prototype.hasOwnProperty.call(x, "y"). Para las matrices Creo que es posible que desee Array.prototype.indexOf, _.indexOfo_.contains
nackjicholson

13

Puedes recortar eso un poco así:

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

15
Eso fallaría con x = {y:undefined}
James

20
¿Alguien necesita distinguir entre "no definido" y "definido como indefinido"?
jpsimons

16
@darkporter lo hago a veces;)
mmm

6

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.


Siempre puedes usar (x && x.hasOwnProperty('y'))o(x && 'y' in x)
gnarf

Estoy de acuerdo, probar para x debería ser un caso separado por sí solo. También produce mejores informes de errores.
b01

Eso falló para mí. Si x no está definido, typeof (xy) devuelve una ReferenceErrorcadena en lugar de la cadena 'undefined'
Craig

1

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

-2

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!");

1
Porque es malo leer y no escribir estrictamente. Debo preguntarte: ¿por qué no simplemente x.hasOwnProperty('y')?
Fabian Picone
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.