comprobación de JavaScript para no nulo

132

A continuación se muestra un fragmento de código, donde recuperamos un valor de formulario. Antes de continuar con el procesamiento, verifique si el valor no es nulo.

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}

¿Alguna idea de por qué sucede así ...?

ria
fuente
2
CW sucedió porque más de 6 usuarios editaron la pregunta.
! == en lugar de! =
GetBackerZ

Respuestas:

78

Es porque val no lo es null, pero contiene'null' como una cadena.

Intenta comprobar con 'nulo'

if ('null' != val)

Para una explicación de cuándo y por qué esto funciona, vea los detalles a continuación .

Arsen Mkrtchyan
fuente
2
debería ser si (nulo! = val) de alguna manera no funcionaba con las comillas
Ananda
Mr.x en la pregunta, nulo era como una cadena ... su caso probablemente sea diferente
Arsen Mkrtchyan
145

esto hará el truco para ti

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}
usuario144390
fuente
22
Si bien técnicamente esto funciona, un doble no (!!) es un paso en falso de programación. Es realmente el equivalente de if(val), que es mucho más claro de leer. Me apegaría a eso (fyi Ujwal, !! val debería funcionar técnicamente en C o C ++ también) ver aquí los valores de 'veracidad' de javascript: janosch.woschitz.org/javascript-equality-comparison
Will Buck
2
¿qué tal si (! Boolean (val))
thedjaney
1
!! es solo un doble negativo, por lo que literalmente dice if (val.exists). ¡Todavía me gusta cómo se ve!
Kurai Bankusu
12
esto fallará si val = 0desde entonces se !!0evalúa como falso
punkrockpolly
3
No es un simple doble negativo. Es un doble negativo transformador. Básicamente, estás transformando la variable en booleana. Hay mucho que decir sobre el tema, pero baste decir que, en los casos en que la variable es 0, false, null, undefinedo algo por el valor que se resuelve en trueuno!, Usted va a obtener falsepor !!. Debe usarse con moderación si es que lo hace.
Guy Passy
83

Hay 3 formas de verificar "no nulo". Mi recomendación es usar Strict Not Version.

1. Estricto no versión

if (val !== null) { ... }

La versión estricta no utiliza el "Algoritmo estricto de comparación de igualdad" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 . los!== tiene un rendimiento más rápido, que el!= operador debido a que la igualdad estricta Comparación algoritmo no encasillado valores.

2. No estricta no versión

if (val != 'null') { ... }

La versión no estricta utiliza el "Algoritmo de comparación de igualdad abstracta" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . El !=tiene un rendimiento más lento que el!== operador debido a que el algoritmo de comparación abstracta Igualdad typecasts valores.

3. Doble no versión

if (!!val) { ... }

La versión no doble !!tiene un rendimiento más rápido que la versión no estricta !==y la versión no estricta !=( https://jsperf.com/tfm-not-null/6 ). Sin embargo, encasillará los valores de "Falsey" como undefinedy NaNen falso ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ) lo que puede conducir a resultados inesperados, y tiene peor legibilidad porque nullno se declara explícitamente

revs tfmontague
fuente
Es muy extraño !!valfuncionó para mí pero val!==nullno lo ha hecho. Por que es
TheLogicGuy
@TheLogicGuy - ¿Cuál es el tipo de datos val? console.log(typeof val).
tfmontague
número. el código elimina los valores "incorrectos" de la matriz (nulo, 0, etc.). Aquí está el código: pastebin.com/L7Z1BtuL
TheLogicGuy
1
@TheLogicGuy: su problema real no tiene nada que ver con nulo. NaN no se filtra correctamente, eso siempre devolverá verdadero. Esto debería funcionar:! (IsNaN (val) && (typeof val! == "undefined")). En Javascript hay un concepto conocido como "Verdad" y "Falsey". El operador doble no !!eliminará más que solo null. Se convertirá NaNy se convertirá undefineden falso también. Y es por eso que su matriz se filtra correctamente cuando usa el doble no operador !!.
tfmontague
30

Úselo !==como lo !=llevará a un mundo de rareza de tabla de verdad JavaScript no transitiva.

Plynx
fuente
A menos que desee verificar específicamente para undefinedo null. En cuyo caso val != nullvolverá truepara undefinedo nullno para otros valores de falsey como 0.
Eric H
8

Debería utilizar el not equalsoperador de comparación estricta !==para que si el usuario ingresa "null", no llegue al else.

Warty
fuente
1
Susan Null no sería feliz si su nombre no fuera aceptado en un formulario de entrada de datos jajaja
Andez
5

Posiblemente es porque el valor de vales en realidad la cadena en "null"lugar del valor null.

ScottyUCSD
fuente
3

Esto debería funcionar bien ...

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }
vkGunasekaran
fuente
2

Si desea poder incluir 0 como valor válido:

if (!!val || val === 0) { ... }
punkrockpolly
fuente
1

Esto funcionará:

if (val) {
    alert("Not null");
} else {
    alert("Null");
}
MoH
fuente