2993 votos

La detección de un objeto indefinido de la propiedad en JavaScript

¿Cuál es la mejor manera de comprobar si la propiedad de un objeto en JavaScript no está definido?

Lo siento, al principio me dijo variable, en lugar de la propiedad del objeto. Creo que el mismo == undefined enfoque no funciona allí.

942voto

Mark Puntos 7136

Yo creo que hay un número de respuestas incorrectas a este tema. Contrariamente a la creencia común "undefined" NO es una palabra clave en javascript, y pueden, de hecho, tienen un valor asignado.

// Degenerate code. DO NOT USE.
var undefined = false;  // Shockingly, this is completely legal!
if(myVar === undefined) {
 alert("You have been misled. Run away!");
}

Además, myVar === undefined , se producirá un error en la situación en la que myVar es no declarado.

El más robusto forma de realizar esta prueba es:

if(typeof myVar === "undefined")

Este siempre devuelve el resultado correcto, e incluso se encarga de la situación en la que myVar no se ha declarado.

166voto

Pandincus Puntos 5785

En JavaScript no es null y no es indefinido. Tienen significados diferentes.

  • indefinido significa que el valor de la variable no ha sido definida; no se sabe cuál es el valor.
  • null significa que el valor de la variable se define y establece en null (no tiene ningún valor).

Marijn Haverbeke los estados, libre, libro online "Elocuente JavaScript" (el énfasis es mío):

Hay también un valor similar, null, cuyo significado es 'este valor está definido, pero no tiene un valor". La diferencia entre el significado de undefined y null es principalmente académico, y no suelen ser muy interesante. En la práctica los programas, a menudo es necesario para comprobar si algo tiene 'valor'. En estos casos, la expresión de algo == undefined puede ser utilizado, ya que, aunque no son exactamente el mismo valor, null == undefined producirá cierto.

Así, supongo que la mejor forma de comprobar si algo no estaba definida sería:

if (something == undefined)

Espero que esto ayude!

Edit: En respuesta a su edición de propiedades del objeto debería funcionar de la misma manera.

var person = {
    name: "John",
    age: 28,
    sex: "male"
};

alert(person.name); // "John"
alert(person.fakeVariable); // undefined

71voto

Michael Anderson Puntos 21181

La cuestión se reduce a tres casos:

  1. El objeto tiene la propiedad y su valor no es undefined.
  2. El objeto tiene la propiedad y su valor es undefined.
  3. El objeto no tiene la propiedad.

Esto nos dice algo que considero importante:

Hay una diferencia entre un indefinido miembro y un miembro definido con un valor indefinido.

Pero, por desgracia, typeof obj.foo no nos dice cuál de los tres casos tenemos. Sin embargo podemos combinar esto con "foo" in obj distinguir los casos.

                               |  typeof obj.x === 'undefined' | !("x" in obj)
1.                     { x:1 } |  false                        | false
2.    { x : (function(){})() } |  true                         | false
3.                          {} |  true                         | true

Vale la pena destacar que estas pruebas son las mismas para null entradas demasiado

                               |  typeof obj.x === 'undefined' | !("x" in obj)
                    { x:null } |  false                        | false

Yo diría que en algunos casos tiene más sentido (y es más claro) para comprobar si la propiedad está ahí, hay que comprobar si es indefinido, y el único caso en donde esta comprobación será diferente es el caso 2, el caso raro de una entrada real en el objeto con un valor indefinido.

Por ejemplo: acabo de refactorización un montón de código que tenía un montón de comprueba si un objeto tenía una propiedad determinada.

if( typeof blob.x != 'undefined' ) {  fn(blob.x); }

El que estaba más claro que cuando se escriben sin comprobar indefinido.

if( "x" in blob ) { fn(blob.x); }

Pero como se ha mencionado, estos no son exactamente los mismos (pero son más que suficiente para mis necesidades).

46voto

Kevin Puntos 261
if ( typeof( something ) == "undefined") 

Esto funcionó para mí, mientras los otros no.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X