verificação de javascript para não nulo

132

Abaixo está um trecho de código, onde recuperamos um valor de formulário. Antes do processamento adicional, verifique se o valor não é 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");
}

Alguma idéia de por que isso acontece tão .. ??

ria
fonte
2
A CW aconteceu por causa de mais de 6 usuários editando a pergunta.
VOCÊ
! == em vez de! =
GetBackerZ

Respostas:

78

É porque val não é null, mas contém 'null'como uma string.

Tente verificar com 'null'

if ('null' != val)

Para uma explicação de quando e por que isso funciona, consulte os detalhes abaixo .

Arsen Mkrtchyan
fonte
2
deve ser if (null = val!) de alguma forma ele não estava trabalhando com as citações
Ananda
Mr.X na questão, null era tão corda ... o seu caso é provavelmente diferente
Arsen Mkrtchyan
145

isso fará o truque para você

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}
user144390
fonte
22
enquanto tecnicamente isso funciona, um duplo não (!!) é um falso-passo de programação. É realmente o equivalente a if(val), que é muito mais claro de se ler. Gostaria de manter isso (fyi Ujwal, !! val, tecnicamente, também deve funcionar em C ou C ++). Veja aqui os valores de ' veracidade
Will Buck
2
como sobre se (booleano (val)!)
thedjaney
1
!! é apenas um duplo negativo, então está literalmente dizendo se (val.exists). Eu ainda gosto da aparência!
Kurai Bankusu
12
isso falhará se, val = 0desde que for !!0avaliado como falso
punkrockpolly
3
Não é um simples duplo negativo. É um duplo negativo transformador. Você está basicamente transformando a variável em um booleano. Não há muito a dizer sobre o assunto, mas basta dizer que nos casos em que a variável é 0, false, null, undefinedou algum tal valor que resolve truecom um!, Você está indo para obter falsepara !!. Deve ser usado com moderação, se houver.
Guy Passy
83

Existem três maneiras de verificar "não nulo". Minha recomendação é usar a versão estrita não.

1. Versão Estrita Não

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

A Versão Estrita Não usa o "Algoritmo Estrito de Comparação de Igualdade" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6 . O !==desempenho é mais rápido que o !=operador, porque o algoritmo de comparação estrita de igualdade não tipifica valores.

2. Versão Não Estrita

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

A versão não estrita usa o "Algoritmo de comparação de igualdade abstrata" http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3 . O !=desempenho é mais lento que o !==operador, porque o algoritmo de comparação de igualdade de igualdade abstrai valores.

3. Double Not Version

if (!!val) { ... }

A versão Double Not Version !!tem desempenho mais rápido do que a versão Strict Not !==e a Non Strict Not Version !=( https://jsperf.com/tfm-not-null/6 ). No entanto, será estereotipado valores "Falsey" como undefinede NaNem False ( http://www.ecma-international.org/ecma-262/5.1/#sec-9.2 ), que pode levar a resultados inesperados, e tem pior legibilidade porque nullnão é declarado explicitamente.

tfmontague
fonte
Isso é muito estranho. !!valtrabalhou para mim, mas val!==nullnão. Por que é isso?
TheLogicGuy
@TheLogicGuy - Qual é o tipo de dados val? console.log(typeof val).
precisa saber é o seguinte
número. o código remove valores "ruins" da matriz (nulo, 0 etc). Aqui está o código: pastebin.com/L7Z1BtuL
TheLogicGuy 6/16
1
@TheLogicGuy - Seu problema real não tem nada a ver com nulo. O NaN não está filtrando corretamente - isso sempre retornará verdadeiro. Isso deve funcionar:! (IsNaN (val) && (tipo de val! == "indefinido")). Em Javascript, existe um conceito conhecido como "Truthy" e "Falsey". O operador duplo não !!removerá mais do que apenas null. Ele também será convertido NaNe undefinedfalso. E é por isso que sua matriz filtra corretamente ao usar o não operador duplo !!.
Tfmontague 06/08/19
30

Use !==como o !=levará a um mundo de estranheza não-transitória na tabela de verdade do JavaScript.

Plynx
fonte
A menos que você queira verificar especificamente por undefinedou null. Nesse caso val != null, retornará truepara undefinedou nullnão para outros valores de falsey como 0.
Eric H
8

Você deve usar o not equalsoperador de comparação estrita !==para que, se o usuário inserir "null", você não acessará o else.

Warty
fonte
1
Susan Null não seria feliz se o seu nome não foi aceito em um formulário de entrada de dados lol
Andez
5

Possivelmente, porque o valor de valé realmente a string "null"e não o valor null.

ScottyUCSD
fonte
3

Isso deve funcionar bem ..

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

Se você deseja poder incluir 0 como um valor válido:

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

Isso funcionará:

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