Comprobar si el objeto existe en JavaScript


313

¿Cómo verifico la existencia de un objeto en JavaScript?

Los siguientes trabajos:

if (!null)
   alert("GOT HERE");

Pero esto arroja un error:

if (!maybeObject)
   alert("GOT HERE");

El error:

maybeObject no está definido.

Respuestas:


578

Puede usar el typeofoperador de forma segura en variables indefinidas.

Si se le ha asignado algún valor, incluido nulo, typeof devolverá algo distinto de indefinido. typeof siempre devuelve una cadena.

Por lo tanto

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

73
si siempre es una cadena, realmente podría (debería) hacer !==para la comparación.
Micah

99
Dado que esta es una característica central de Javascript, es una pena que no haya una función integrada mejor y menos propensa a errores. La comparación de cadenas evita que el compilador nos diga 100% de forma confiable cuando cometimos un pequeño error (como un error tipográfico) en este tipo de comprobaciones.
Domi

en mi caso, estoy buscando BUSCAR este objeto, por lo que esto no ayuda. quiero una solución que puedo utilizar en la consola como wel, para ver si el objeto se encuentra en algún lugar domtree sin ningún clickery ..
blamb

@TJCrowder Esos ejemplos ya no parecen ser accesibles.
Stefan van den Akker

1
@StefanvandenAkker: el enlace al mal ejemplo debe ser jsbin.com/ibeho3/1 . El buen ejemplo estuvo bien: jsbin.com/ibeho3/2 . (Lamentablemente, JSBin redirige a lo último, y la gente lo ha estado editando a una pulgada de su vida).
TJ Crowder

48

Aquí hay muchas medias verdades, así que pensé en aclarar algunas cosas.

En realidad, no puede saber con precisión si existe una variable (a menos que desee ajustar cada segunda línea en un bloque try-catch).

La razón es que Javascript tiene este notorio valor, lo undefinedque sorprendentemente no significa que la variable no esté definida o que no exista.undefined !== not defined

var a;
alert(typeof a); // undefined (declared without a value)
alert(typeof b); // undefined (not declared)

Entonces, tanto una variable que existe como otra que no puede informarle undefined tipo.

En cuanto a la idea errónea de Kevin @, null == undefined. Se debe a la coerción de tipo, y es la razón principal por la que Crockford sigue diciéndole a todos los que no están seguros de este tipo de cosas que siempre usen un operador de igualdad estricto ===para probar posibles valores falsos. null !== undefinedte da lo que podrías esperar. Tenga en cuenta también que foo != nullpuede ser una forma efectiva de verificar si una variable no es undefinedninull . Por supuesto, puede ser explícito, porque puede ayudar a la legibilidad.

Si restringe la pregunta para verificar si existe un objeto, typeof o == "object"puede ser una buena idea, excepto si no considera los objetos de matrices, ya que también se informará que ese tipo objectpuede confundirlo un poco. Sin mencionar que typeof nulltambién te daráobject que simplemente está mal.

La zona primaria donde realmente se debe tener cuidado con typeof, undefined, null, unknowny otros misterios son objetos de acogida. No se puede confiar en ellos. Son libres de hacer casi cualquier cosa sucia que quieran. Así que tenga cuidado con ellos, verifique la funcionalidad si puede, porque es la única forma segura de usar una función que puede no existir.


55
Simplemente hacerlo foo!=nullproducirá un Error de referencia si foono está definido. Por lo tanto, es mejor usarlo typeof, a menos que esté planeando detectar la excepción.
JAL

1
Te lo escribo de nuevo: undefined !== not defined&&foo != null can be an effective way to check if a variable is neither 'undefined' nor 'null' . No dije que != nullsea ​​bueno para verificar si existe. Lo estás sacando de contexto. (También mencioné que es una nota al margen, no estrictamente relacionada con el tema de la pregunta del OP)
gblazex

2
Vuelve a confundir el término no definido con el tipo undefined. Ellos no son los mismos. (note) it can be used !== you should use. Use el sentido común mientras lee. Cuando se declara la variable (lista de parámetros u otro lugar) y desea verificar si tiene un valor, !=nulo es completamente seguro. Es un caso de uso diferente al que solicitó el OP, por eso lo introduje como una nota. Todo el párrafo es sobre la publicación de @ Kevin y la coerción de tipo por cierto. Como puedes notar si lees con cuidado.
gblazex

@JAL que se está perdiendo la parte que está no correr el riesgo de un error al usar != nullcuando se sabe que la variable ha sido declarada. Esto es muy útil para verificar argumentos de función, considere:var hasValue = function(foo) {return foo != null}
tybro0103

@ tybro0103 es cierto, pero el problema completo es "¿Cómo verifico la existencia de un objeto en JavaScript?". Si está seguro de que se ha declarado, esa es una situación diferente.
JAL

12

Puedes usar:

if (typeof objectName == 'object') {
    //do something
}

8

Dos caminos.

typeof para variables locales

Puede probar un objeto local usando typeof:

if (typeof object !== "undefined") {}

ventana para variables globales

Puede probar un objeto global (uno definido en el alcance global) inspeccionando el objeto de la ventana:

if (window.FormData) {}

7

Si ese es un objeto global, puede usar if (!window.maybeObject)


Descubrí que window.hasOwnProperty('maybeObject')es un poco más legible, si es un objeto global
Nathaniel Rogers

5

Podrías usar "typeof".

if(typeof maybeObject != "undefined")
    alert("GOT HERE");

4

El hilo se abrió hace bastante tiempo. Mientras tanto, creo que el uso de un operador ternario es la opción más simple:

maybeObject ? console.log(maybeObject.id) : ""

Sí, algo en la línea de var maybeObject = typeof maybeObject !== "undefined" ? Chart:false;y verifique si no false.
Hmerman6006

3

Solía ​​hacer un if(maybeObject)chequeo nulo en mis javascripts.

if(maybeObject){
    alert("GOT HERE");
}

Entonces, solo si maybeObject- es un objeto, se mostrará la alerta. Tengo un ejemplo en mi sitio.

https://sites.google.com/site/javaerrorsandsolutions/home/javascript-dynamic-checkboxes


El problema es si maybeObject no estaba declarado que va a lanzar el error: maybeObject no está definido
Juanma Menéndez

si maybeObjectes así 0, 0.0, or "", se verifica como falso
alejandrociatti

3

Acabo de probar los ejemplos typeOf de arriba y ninguno funcionó para mí, así que en su lugar he usado esto:

    btnAdd = document.getElementById("elementNotLoadedYet");
    if (btnAdd) {
       btnAdd.textContent = "Some text here";
    } else {
      alert("not detected!");
    }


1

Además de verificar la existencia del objeto / variable, es posible que desee proporcionar una salida del "peor de los casos" o al menos atraparlo en una alerta para que no pase desapercibido.

Ejemplo de función que verifica, proporciona alternativas y detecta errores.

function fillForm(obj) {
  try {
    var output;
    output = (typeof obj !== 'undefined') ? obj : '';
    return (output);
  } 
  catch (err) {
    // If an error was thrown, sent it as an alert
    // to help with debugging any problems
    alert(err.toString());
    // If the obj doesn't exist or it's empty 
    // I want to fill the form with ""
    return ('');
  } // catch End
} // fillForm End

También creé esto porque el objeto que le estaba pasando podría ser x, xm, xm [z] y typeof xm [z] fallaría con un error si xm no existiera.

Espero que ayude. (Por cierto, soy novato con JS)


1

para mí esto funcionó para un objeto DOM:

if(document.getElementsById('IDname').length != 0 ){
   alert("object exist");
}

1

Si solo le importa su existencia (¿se ha declarado?), La respuesta aprobada es suficiente:

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

Si le importa que tenga un valor real, debe agregar:

if (typeof maybeObject != "undefined" && maybeObject != null ) {
   alert("GOT THERE");
}

Como typeof( null ) == "object"

p.ej bar = { x: 1, y: 2, z: null}

typeof( bar.z ) == "object" 
typeof( bar.not_present ) == "undefined" 

de esta manera verifica que no sea ninguno nullo undefined, y dado typeofque no se produce un error si el valor no existe más&& los cortocircuitos, nunca obtendrá un error en tiempo de ejecución.

Personalmente, sugeriría agregar un ayudante fn en alguna parte (y no confiemos typeof()):

function exists(data){
   data !== null && data !== undefined
}

if( exists( maybeObject ) ){
    alert("Got here!"); 
}

0
if (n === Object(n)) {
   // code
}

55
Si bien este bloque de código puede responder la pregunta del OP, esta respuesta sería mucho más útil si explica cómo este código es diferente del código de la pregunta, qué ha cambiado, por qué lo ha cambiado y por qué eso resuelve el problema sin presentar a otros.
Mifeet


-1

establezca el valor del cuadro de texto en un cuadro en línea usando el panel con pestañas de alineación div. Entonces, antes que nada, antes de establecer el valor, debemos verificar que el marco de paneles con pestañas seleccionado esté disponible o no utilizando los siguientes códigos:

Código Javascript:

/////////////////////////////////////////
<script>

function set_TextID()
            {
                try
                    {
                        if(!parent.frames["entry"])
                            {
                            alert("Frame object not found");    
                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["entry"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["education"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["education"].document.getElementById("form_id").value=setText;
                            }
                            if(!parent.frames["contact"])
                            {
                            alert("Frame object not found");    

                            }
                            else
                            {
                                var setText=document.getElementById("formx").value;
                                parent.frames["contact"].document.getElementById("form_id").value=setText;
                            }

                        }catch(exception){}
                }

</script>

-1

cero y nulo son punteros implícitos. Si no está haciendo aritmética, comparando o imprimiendo '0' en la pantalla, no hay necesidad de escribirlo. Es implícito. Como en implícito. Typeof tampoco se requiere por la misma razón. Reloj.

if (obj) console.log ("existe");

No vi la solicitud de un no o de lo contrario no está incluido como. Por mucho que me encanta el contenido extra que no encaja en la pregunta. Vamos a mantenerlo simple.


Veo un no en la pregunta: if (!maybeObject)pero, de hecho, el título pide lo contrario.
Armali

-4

Creo que es más fácil así

if(myobject_or_myvar)
    alert('it exists');
else
   alert("what the hell you'll talking about");

-10

O bien, todos ustedes pueden comenzar a usar mi exclusivo existe () método lugar y ser capaces de hacer cosas consideradas imposibles. es decir:

Cosas como: exists("blabla")o incluso: exists("foreignObject.guessedProperty.guessNext.propertyNeeded")también son posibles ...


44
¿Y dónde está ese método?
v010dya
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.