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 sedatacreó una variable indefinida y se generó un errordata != null.La función se llamó específicamente con
null(oundefined), como argumento, en cuyo casodata != nullya protege el código interno,&& data !== undefinedinutilizándolo.La función se llamó con un argumento no nulo, en cuyo caso pasará trivialmente ambos
data != nullydata !== 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 ladatavariable se evalúa como verdadera.undefined,nullfalso, 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 pasarfalseo0como valores paradata.if(typeof someUndefVar == whatever) -- worksyif(someUnderVar) -- error.data !== null && data !== undefined, que es equivalente a lodata != nullque 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 ambasnullyundefinedse verificará con las dos condiciones posteriores.undefinedIMO 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 = 1Respuestas:
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!= nullseguido por!== undefinedser inútil.fuente
data !== null && data !== undefinedSin embargo, tendría sentido.data != nullverificaría ambosnullyundefined(pero, curiosamente, solo paranullyundefined, y no los otros valores falsos).En JavaScript,
nulles 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
!= nullserá verdadero para todos los valores exceptonullyundefined, y estamos seguros de que esta variable se declara.typeofen 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í,
datase 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
datano 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 === undefinedpara variables no declaradas.fuente
foo === undefinedpeligroso de usar. Hace que su código falle por la misma condición que estaba tratando de prevenir.foo === undefinedes perfectamente aceptable en la situación del OP (suponiendo queundefinedno se haya anulado). La respuesta tampoco explica por qué!==debería usarse en lugar de!=.La forma simple de hacer tu prueba es:
fuente
dataes 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).""o0oNaN(u otros) el "si" bloque será omitida; que puede o no ser la intención de OP.fuente
null.