A menudo veo código JavaScript que comprueba parámetros indefinidos, etc. de esta manera:
if (typeof input !== "undefined") {
// do stuff
}
Esto parece un poco despilfarrador, ya que implica tanto una búsqueda de tipo como una comparación de cadenas, sin mencionar su verbosidad. Sin undefined
embargo, es necesario porque podría renombrarse.
Mi pregunta es:
¿Cómo es ese código mejor que este enfoque?
if (null != input) {
// do stuff
}
Hasta donde sé, no puedes redefinir null
, por lo que no se romperá inesperadamente. Y, debido a la coerción de tipo del !=
operador, esto comprueba ambos undefined
y null
... que a menudo es exactamente lo que desea (por ejemplo, para parámetros de función opcionales).
Sin embargo, esta forma no parece generalizada e incluso hace que JSLint te grite por usar el !=
operador maligno .
¿Por qué esto se considera mal estilo?
fuente
if (null != input)
es solo "Yoda Speak" para el hablante de inglés (de uno soy ... uuammmmm) así que si equivalen a lo mismo, en realidad es solo semántica. EN MI HUMILDE OPINIÓN.Respuestas:
typeof
es más seguro ya que permite que el identificador nunca se haya declarado antes:fuente
==
puede ser mejor, porque prueba tanto para nulo como para indefinido.!==
o===
al comparar un valor cuyo tipo se sabe que es una cadena.Si se declara la variable (ya sea con la
var
palabra clave, como un argumento de función o como una variable global), creo que la mejor manera de hacerlo es:jQuery lo hace, así que es lo suficientemente bueno para mí :-)
De lo contrario, tendrá que usar
typeof
para evitar aReferenceError
.Si espera que se redefina lo indefinido, puede ajustar su código de esta manera:
O consígalo a través del
void
operador:fuente
undefined
es el nombre dado al parámetro de la función, no su valor. No se pasa nada a la función, lo que significa que el valor del primer parámetro no está definido.Buen camino:
Pero la mejor manera es verificar a través de:
fuente
if (typeof neverDeclared === typeof undefined) {
pero Lint arroja un error. "Esperaba una cadena y en su lugar vi 'typeof'". ¿Cómo evitarías este error? ¿Deberíamos someternos a las demandas de Lint y utilizar el "buen camino"?typeof neverDeclared === typeof void 0
;-Dif(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {
pero es bastante largo.Realmente no debería preocuparse por un nombre indefinido. Si alguien cambia el nombre de indefinido, tendrá muchos más problemas que unos pocos si los cheques fallan. Si realmente desea proteger su código, envuélvalo en un IFFE (expresión de función invocada inmediatamente) como este:
Si está trabajando con variables globales (que ya está mal) en un entorno de navegador, comprobaría si no está definido de esta manera:
Dado que las variables globales son parte del objeto de la ventana, simplemente puede verificar contra indefinido en lugar de convertir a una cadena y comparar cadenas.
Además de eso, ¿por qué sus variables no están definidas? He visto una gran cantidad de código en el que verifican la existencia de variables y realizan algunas acciones basadas en eso. Ni una sola vez he visto dónde este enfoque ha sido correcto.
fuente
Si está realmente preocupado por la redefinición de lo indefinido, puede protegerse contra esto con algún método auxiliar como este:
Esto funciona porque cuando alguien escribe
undefined = "foo"
, solo deja que el nombreundefined
haga referencia a un nuevo valor, pero no cambia el valor real deundefined
.fuente
undefined_check
en la parte superior y luego usarla en cualquier parte de su código.typeof
comprobación.También puede usar el operador vacío para obtener un valor indefinido:
(Y sí, como se señaló en otra respuesta, esto arrojará un error si la variable no se declaró, pero este caso a menudo se puede descartar mediante inspección de código o refactorización de código, por ejemplo,
window.input !== void 0
para probar variables globales o agregarvar input
).fuente
De hecho, me he encontrado si
(typeof input !== 'undefined')
en este escenario donde se usa para proporcionar parámetros de función predeterminados:ES6 proporciona nuevas formas de introducir parámetros de función predeterminados de esta manera:
Esto es menos detallado y más limpio que la primera opción.
fuente
fuente
fuente
fuente
funciona bien Por supuesto, no es una
null
comparación, pero generalmente encuentro que si necesito distinguir entreundefined
ynull
, en realidad prefiero distinguir entreundefined
y cualquier valor falso, entonceslo hace.
Si un programa redefine
undefined
, de todos modos es realmente una muerte mental.La única razón por la que puedo pensar es por la compatibilidad con IE4, no entendió la
undefined
palabra clave (que en realidad no es una palabra clave, desafortunadamente), pero por supuesto que los valores podrían serloundefined
, por lo que tenía que tener esto:y la comparación anterior funcionaría bien.
En su segundo ejemplo, ¿probablemente necesite paréntesis dobles para hacer feliz a la pelusa?
fuente
input == undefined
volverátrue
en unanull
entrada.