Me he encontrado con el siguiente código:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
Soy algo nuevo en JavaScript, pero, por otras preguntas que he estado leyendo aquí, tengo la impresión de que este código no tiene mucho sentido.
Obtendrá un error si accede a una variable indefinida en cualquier contexto que no seatypeof
.
Actualización: la (cita de) la respuesta anterior puede ser engañosa. Debería decir "una variable no declarada" , en lugar de "una variable indefinida" .
Como descubrí, en las respuestas de Ryan ♦ , maerics y nwellnhof , incluso cuando no se proporcionan argumentos para una función, sus variables para los argumentos siempre se declaran. Este hecho también demuestra que es incorrecto el primer elemento de la lista a continuación.
Según tengo entendido, se pueden experimentar los siguientes escenarios:
Se llamó a la función sin argumentos, por lo que sedata
creó una variable indefinida y se generó un errordata != null
.La función se llamó específicamente con
null
(oundefined
), como argumento, en cuyo casodata != null
ya protege el código interno,&& data !== undefined
inutilizándolo.La función se llamó con un argumento no nulo, en cuyo caso pasará trivialmente ambos
data != null
ydata !== undefined
.
P: ¿Es correcto mi entendimiento?
He intentado lo siguiente, en la consola de Firefox:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
No puedo entender un caso en el que el data !== undefined
after data != null
pueda ser de alguna utilidad.
fuente
if (data)
. Es una forma mnemónica de Javascript para verificar si ladata
variable se evalúa como verdadera.undefined
,null
falso, 0, cadena vacía, matriz vacía y objeto (?) sin propiedades se evalúa como falso, el resto es verdadero.if(data)
significaría que no puede pasarfalse
o0
como valores paradata
.if(typeof someUndefVar == whatever) -- works
yif(someUnderVar) -- error
.data !== null && data !== undefined
, que es equivalente a lodata != null
que es equivalente adata != undefined
. La forma anterior tiende a ser favorecida ya que es más explícita sobre las condiciones, mientras que sería fácil pasar por alto ambasnull
yundefined
se verificará con las dos condiciones posteriores.undefined
IMO son un olor a código. No es una palabra clave protegida comonull
, es una variable que no está definida. Esto es completamente válido y va a romper su código:undefined = 1
Respuestas:
Una "variable indefinida" es diferente del valor
undefined
.Una variable indefinida:
Una variable con el valor
undefined
:Cuando una función toma un argumento, ese argumento siempre se declara incluso si su valor es
undefined
, por lo que no habrá ningún error. Sin embargo, tienes razón en ser!= null
seguido por!== undefined
ser inútil.fuente
data !== null && data !== undefined
Sin embargo, tendría sentido.data != null
verificaría ambosnull
yundefined
(pero, curiosamente, solo paranull
yundefined
, y no los otros valores falsos).En JavaScript,
null
es un objeto singleton especial que es útil para señalar "sin valor". Puede probarlo en comparación y, como es habitual en JavaScript, es una buena práctica usar el===
operador para evitar la coerción de tipo confusa:Como @rynah menciona, "indefinido" es un poco confuso en JavaScript. Sin embargo, siempre es seguro probar si la
typeof(x)
cadena es "indefinida", incluso si "x" no es una variable declarada:Además, las variables pueden tener el "valor indefinido" si no se inicializan:
Poniendo todo junto, su cheque debería verse así:
Sin embargo, dado que la variable "datos" siempre se define ya que es un parámetro de función formal, no es necesario utilizar el operador "typeof" y puede compararlo directamente con el "valor indefinido".
Este fragmento equivale a decir "si la función fue llamada con un argumento que está definido y no es nulo ..."
fuente
!= null
será verdadero para todos los valores exceptonull
yundefined
, y estamos seguros de que esta variable se declara.typeof
en otras situaciones, incluso puede ser peligroso, ¿qué pasa si escribe mal el nombre de la variable? Eso puede pasar desapercibido durante mucho tiempo porque no hay error.!=
en absoluto, única comparación estricta,!==
?===
) a menos que realmente sepas lo que estás haciendo y quieras una comparación después de la conversión (==
).undefined
. Además, Safari en el iPad no lo hará bajo ninguna circunstancia. Ni siquiera puedesdelete window.undefined
.En su caso, use
data==null
(lo cual es cierto SOLO para valores nulos e indefinidos; en la segunda imagen, enfoque en filas / columnas nulo-indefinido)Mostrar fragmento de código
Aquí tienes todo ( src ):
Si
== (su negación ! = )
=== (su negación ! == )
fuente
P: La función se invocó sin argumentos, lo que convierte los datos en una variable indefinida y genera un error en los datos! = Nulo.
A: Sí,
data
se establecerá en indefinido. Consulte la sección 10.5 Declaración de vinculación de instanciación de la especificación. Pero acceder a un valor indefinido no genera un error. Probablemente esté confundiendo esto con acceder a una variable no declarada en modo estricto que genera un error.P: La función se llamó específicamente con nulo (o indefinido), como argumento, en cuyo caso data! = Null ya protege el código interno, lo que hace que && data! == indefinido sea inútil.
P: La función se llamó con un argumento no nulo, en cuyo caso pasará trivialmente data! = Null y data! == undefined.
A: correcto. Tenga en cuenta que las siguientes pruebas son equivalentes:
Consulte la sección 11.9.3 El algoritmo de comparación de igualdad abstracta y la sección 11.9.6 El Algoritmo de comparación de igualdad estricto de la especificación.
fuente
data
no existiría en absoluto, en lugar de establecerloundefined
. Agradezco la aclaración, y esas referencias me ayudaron a comprender con más detalle cómo funcionan ambas igualdades.Creo que probar variables para valores que no esperas no es una buena idea en general. Porque la prueba como su puede considerar como escribir una lista negra de valores prohibidos. ¿Pero qué pasa si olvida enumerar todos los valores prohibidos? Alguien, incluso usted, puede descifrar su código al pasar un valor inesperado. Por lo tanto, un enfoque más apropiado es algo así como la lista blanca: probar variables solo para los valores esperados, no inesperados. Por ejemplo, si espera que el valor de los datos sea una cadena, en lugar de esto:
haz algo como esto:
fuente
typeof foo === "undefined"
es diferente defoo === undefined
, nunca los confundas.typeof foo === "undefined"
es lo que realmente necesitas. Además, use!==
en lugar de!=
Entonces la declaración se puede escribir como
Editar:
No se puede usar
foo === undefined
para variables no declaradas.fuente
foo === undefined
peligroso de usar. Hace que su código falle por la misma condición que estaba tratando de prevenir.foo === undefined
es perfectamente aceptable en la situación del OP (suponiendo queundefined
no se haya anulado). La respuesta tampoco explica por qué!==
debería usarse en lugar de!=
.La forma simple de hacer tu prueba es:
fuente
data
es una cadena, esta prueba devuelve falso en las cadenas vacías, lo que puede o no ser apropiado (la función podría tratar con la cadena vacía de alguna manera).""
o0
oNaN
(u otros) el "si" bloque será omitida; que puede o no ser la intención de OP.fuente
null
.