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?

Royhowie
fuente

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) {
  // ......
}
Gnarf
fuente
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
CMS
fuente
18

Underscore.js o Lodash

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

:)

nackjicholson
fuente
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 ) ...
jpsimons
fuente
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.


fuente
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
stt
fuente
-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!");
Hazme
fuente
1
Porque es malo leer y no escribir estrictamente. Debo preguntarte: ¿por qué no simplemente x.hasOwnProperty('y')?
Fabian Picone