Comprobar undefined en JavaScript
Si escribes JavaScript más o menos regularmente, en algún momento probablemente te enfrentes a una situación donde hubo una necesidad de comprobar si una variable es undefined.
Pero, ¿cuál es la mejor manera de hacerlo?
La manera intuitiva
Cualquier programador con experiencia en otro lenguaje usará la intuición para averiguar:
if (x === undefined) { ... }
Y esto funcionará sin ningún problema, o casi.
Comparar directamente con undefined funcionará en todos los navegadores modernos. Pero los navegadores antiguos permitían que su valor fuera reasignado así:
undefined = 'new value';
Con esta reasignación, una computación directa no funcionará como se espera.
Este comportamiento fue arreglado en 2009 con ECMAScript 5 :
15.1.1.3 undefined
El valor deundefinedes undefined (ver 8.1). Esta propiedad tiene los atributos{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
La manera "segura"
Si tienes que soportar navegadores antiguos y te preocupa que alguien reasigne el valor de undefined hay otras formas de hacer la comprobación.
Leyendo el tipo
Puedes usar el operador typeof, que devolverá la cadena "undefined" para que puedas comprobarlo.
if (typeof x === "undefined") { ... }
Nota: El operador typeof no lanza un error si la variable no ha sido declarada.
Usando void
Alternativamente, puedes usar el operador void para comprobar undefined. Por ejemplo:
if (x === void(0)) { ... }
En este ejemplo, el cero no tiene ningún significado especial. Como se indica en MDN:
El operador void evalúa la expresión dada y luego devuelve undefined.
Qué manera es mejor
En mi tiempo como consultor, aprendí cuál es la mejor respuesta para este tipo de pregunta: depende. Dependería del caso de uso concreto que tengas, pero puedo darte algunos consejos.
En general, tiendo a usar la convención que ya está presente en el código base. Pero si estás escribiendo un código nuevo que se ejecutará solo en navegadores modernos, sugeriría ir por la comparación directa (es claro y fácil de entender también para personas que no saben JavaScript). Para el soporte de navegadores antiguos, recomiendo encarecidamente crear una función isUndefined y usar la opción de tu elección dentro. Entonces el código expresará su propósito claramente a todos.