validar - valor undefined javascript
JavaScript: undefined!== undefined? (7)
NOTA: Según ECMAScript5.1, sección 15.1.1.3 , window.undefined es de solo lectura.
- Los navegadores modernos implementan esto correctamente. por ejemplo: Safari 5.1, Firefox 7, Chrome 20, etc.
- Indefinido sigue siendo modificable en: Chrome 14, ...
Cuando recientemente integé Facebook Connect con Tersus , inicialmente recibí los mensajes de Invalid Enumeration Value
y Handler already exists
cuando trato de llamar a las funciones de la API de Facebook.
Resultó que la causa del problema era
object.x === undefined
devuelve falso cuando no hay propiedad ''x'' en ''objeto''.
Trabajé alrededor del problema reemplazando la igualdad estricta con la igualdad regular en dos funciones de Facebook:
FB.Sys.isUndefined = function(o) { return o == undefined;};
FB.Sys.containsKey = function(d, key) { return d[key] != undefined;};
Esto hizo que las cosas funcionen para mí, pero parece sugerir algún tipo de colisión entre el código JavaScript de Facebook y el mío.
Que podria causar esto?
Sugerencia: está bien documentado que undefined == null
while undefined !== null
. Este no es el problema aquí. La pregunta es ¿cómo podemos llegar a ser undefined !== undefined
.
De - JQuery_Core_Style_Guidelines
Variables globales:
typeof variable === "undefined"
Variables locales:
variable === undefined
Propiedades:
object.prop === undefined
El problema es que undefined comparado con null usando == da verdadero. La comprobación común para undefined se hace así:
typeof x == "undefined"
esto asegura que el tipo de variable no está definido.
Es una mala práctica usar el operador ==
equality en lugar de ===
.
undefined === undefined // true
null == undefined // true
null === undefined // false
El object.x === undefined
debe devolver true
si x
es una propiedad desconocida.
En el capítulo Partes malas de JavaScript: The Good Parts , Crockford escribe lo siguiente:
Si intenta extraer un valor de un objeto, y si el objeto no tiene un miembro con ese nombre, en su lugar, devuelve el valor indefinido.
Además de indefinido, JavaScript tiene un valor similar llamado null. Son tan similares que == piensa que son iguales. Eso confunde a algunos programadores al pensar que son intercambiables, lo que lleva a un código como
value = myObject[name]; if (value == null) { alert(name + '' not found.''); }
Está comparando el valor incorrecto con el operador equivocado. Este código funciona porque contiene dos errores que se anulan mutuamente. Esa es una forma loca de programar. Está mejor escrito así:
value = myObject[name]; if (value === undefined) { alert(name + '' not found.''); }
Me gustaría publicar información importante sobre undefined
, que los principiantes podrían no conocer.
Mira el siguiente código:
/*
* Consider there is no code above.
* The browser runs these lines only.
*/
// var a;
// --- commented out to point that we''ve forgotten to declare `a` variable
if ( a === undefined ) {
alert(''Not defined'');
} else {
alert(''Defined: '' + a);
}
alert(''Doing important job below'');
Si ejecuta este código, donde la variable a
NUNCA HA SIDO DECLARADA usando var
, obtendrá una EXCEPCIÓN DE ERROR y sorprendentemente no verá ninguna alerta.
En lugar de ''Hacer un trabajo importante a continuación'', su script se TERMINARÁ INESPERADAMENTE, lanzando una excepción no controlada en la primera línea.
Esta es la única forma a prueba de balas para buscar palabras clave undefined
, que fue diseñado para tal fin:
/*
* Correct and safe way of checking for `undefined`:
*/
if ( typeof a === ''undefined'' ) {
alert(
''The variable is not declared in this scope, /n'' +
''or you are pointing to unexisting property, /n'' +
''or no value has been set yet to the variable, /n'' +
''or the value set was `undefined`. /n'' +
''(two last cases are equivalent, don/'t worry if it blows out your mind.''
);
}
/*
* Use `typeof` for checking things like that
*/
Este método funciona en todos los casos posibles.
El último argumento para usarlo es que undefined
puede sobrescribirse potencialmente en versiones anteriores de Javascript:
/* @ Trollface @ */
undefined = 2;
/* Happy debuging! */
Espero haber sido lo suficientemente claro.
Resulta que puedes establecer window.undefined a lo que quieras, y así obtener object.x !== undefined
cuando object.x es el undefined real . En mi caso, inadvertidamente establecí indefinido a nulo.
La forma más fácil de ver esto suceder es:
window.undefined = null;
alert(window.xyzw === undefined); // shows false
Por supuesto, esto no es probable que suceda. En mi caso, el error fue un poco más sutil, y fue equivalente a la siguiente situación.
var n = window.someName; // someName expected to be set but is actually undefined
window[n]=null; // I thought I was clearing the old value but was actually changing window.undefined to null
alert(window.xyzw === undefined); // shows false
UN). Nunca he tenido y nunca confiaré en ninguna herramienta que pretenda producir código sin la codificación del usuario, que se duplica cuando es una herramienta gráfica.
SEGUNDO). Nunca he tenido ningún problema con Facebook Connect. Todo sigue siendo un código JavaScript simple que se ejecuta en un navegador y undefined===undefined
donde sea que se encuentre.
En resumen, debe proporcionar evidencia de que su object.x realmente no estaba definido y no es nulo o no, porque creo que es imposible que lo que está describiendo sea realmente el caso, sin ofender :) - Lo pondría dinero en el problema existente en el código de Tersus.
var a;
typeof a === ''undefined''; // true
a === undefined; // true
typeof a === typeof undefined; // true
typeof a === typeof sdfuwehflj; // true