Estamos frequentemente usando o seguinte padrão de código em nosso código JavaScript
if (typeof(some_variable) != 'undefined' && some_variable != null)
{
// Do something with some_variable
}
Existe uma maneira menos detalhada de verificar que tem o mesmo efeito?
De acordo com alguns fóruns e literatura dizendo simplesmente o seguinte deve ter o mesmo efeito.
if (some_variable)
{
// Do something with some_variable
}
Infelizmente, o Firebug avalia uma declaração como erro no tempo de execução quando some_variable
é indefinido, enquanto a primeira é adequada. Esse é apenas um comportamento (indesejado) do Firebug ou há realmente alguma diferença entre essas duas maneiras?
javascript
null
undefined
Tomas Vana
fonte
fonte
if(some_variable) { ... }
não será executado sesome_variable
éfalse
ou0
ou ...Respostas:
Você precisa diferenciar os casos:
undefined
ou não declaradas . Você receberá um erro se acessar uma variável não declarada em qualquer contexto que não sejatypeof
.Uma variável que foi declarada mas não inicializada é
undefined
.Propriedades indefinidas , como
someExistingObj.someUndefProperty
. Uma propriedade indefinida não gera um erro e simplesmente retornaundefined
, que, quando convertida em um booleano, é avaliada comofalse
. Então, se você não se importa0
efalse
, usarif(obj.undefProp)
está ok. Há um idioma comum baseado neste fato:o que significa "se
obj
tiver a propriedadeprop
, atribua-avalue
, caso contrário, atribua o valor padrãodefautValue
".Algumas pessoas consideram esse comportamento confuso, argumentando que ele leva a erros difíceis de encontrar e recomendam o uso do
in
operador.fonte
undefined
.typeof
retorna uma string. Então, nãovar myVar; typeof(myVar)==undefined
retorna .false
true
Eu acho que a maneira mais eficiente de testar "valor é
null
ouundefined
" éPortanto, essas duas linhas são equivalentes:
Nota 1
Como mencionado na pergunta, a variante curta requer que
some_variable
tenha sido declarada; caso contrário, um ReferenceError será lançado. No entanto, em muitos casos de uso, você pode assumir que isso é seguro:verifique se há argumentos opcionais:
verifique se há propriedades em um objeto existente
Por outro lado,
typeof
pode lidar com variáveis globais não declaradas (simplesmente retornaundefined
). No entanto, esses casos devem ser reduzidos ao mínimo por boas razões, como explicou Alsciende.Nota 2
Esta variante - ainda mais curta - não é equivalente:
tão
Nota 3
Em geral, é recomendável usar em
===
vez de==
. A solução proposta é uma exceção a esta regra. O verificador de sintaxe JSHint ainda fornece aeqnull
opção por esse motivo.No guia de estilo do jQuery :
fonte
== null
é o mais eficiente para testar 'nulo ou indefinido' (que é o tópico das perguntas). Isso não é incomum (usado 43 vezes no jQuery 1.9.1), pois muitas vezes você sabe que a variável foi declarada - ou você testa uma propriedade de um objeto existente comoif( o.foo == null)
.window.someProperty == null
. Para variáveis locais, você pode facilmente garantir que elas sejam declaradas: em vez de escreverif (...) {var local = ""}
writevar local; if (...) { local = ""; }
A verificação de nulo com igualdade normal também retornará true para indefinido.
if (window.variable == null) alert('variable is null or undefined');
fonte
NaN
a partir da equação diferença pode nunca deverá ser igualNos padrões JavaScript mais recentes, como ES5 e ES6, você pode apenas dizer
todos retornam false, que é semelhante à verificação de variáveis vazias do Python. Portanto, se você quiser escrever lógica condicional em torno de uma variável, basta dizer
aqui "null" ou "string vazia" ou "undefined" serão tratados com eficiência.
fonte
null
eundefined
outros valores falsos devem retornar true!0
,NaN
. Isso ocorre quando você deseja capturar a veracidade de um objeto sem manter uma referência ao objeto, para que você possa armazená-lo em vez de um objeto potencialmente grande. Para sua informação, isso também é equivalente!!value
, ao qual o primeiro!
nega a veracidade e o segundo nega novamente.if (var)
que será lançado para booleano, então basicamente completamente inútil ...Boolean(undefined)
funciona, tentar que com uma variável indefinida não funcione, e esse é o objetivo de verificar se há nulo ou indefinido. Isto:if (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }
lança um ReferenceError dizendo "ReferenceError: undeclareVarName não está definido"Se você tentar fazer referência a uma variável não declarada, será gerado um erro em todas as implementações de JavaScript.
As propriedades dos objetos não estão sujeitas às mesmas condições. Se uma propriedade de objeto não tiver sido definida, um erro não será gerado se você tentar acessá-la. Portanto, nessa situação, você pode reduzir:
para
Com isso em mente, e o fato de que variáveis globais são acessíveis como propriedades do objeto global (
window
no caso de um navegador), você pode usar o seguinte para variáveis globais:Em escopos locais, sempre é útil garantir que as variáveis sejam declaradas na parte superior do seu bloco de código, isso economizará nos usos recorrentes de
typeof
.fonte
if (myObj.some_property != null)
para obter um comportamento equivalente.Em primeiro lugar, você deve ser muito claro sobre o que você testa. O JavaScript tem todos os tipos de conversões implícitas para enganar você e dois tipos diferentes de comparador de igualdade:
==
e===
.Uma função
test(val)
que testanull
ouundefined
deve ter as seguintes características:Vamos ver qual das idéias aqui realmente passou no nosso teste.
Estes trabalhos:
Estes não funcionam:
Criei uma entrada jsperf para comparar a correção e o desempenho dessas abordagens. Por enquanto, os resultados são inconclusivos, pois não houve execuções suficientes em diferentes navegadores / plataformas. Reserve um minuto para executar o teste no seu computador!
Atualmente, parece que o
val == null
teste simples oferece o melhor desempenho. Também é praticamente o mais curto. O teste pode ser negadoval != null
se você desejar o complemento.fonte
este é o único caso em que
==
deve ser usado:fonte
val != null
pelo contrário, apenas um=
e, já que por @Yukulele é o ÚNICO usado,==
você saberá o que faz quando o vê.Como não há uma resposta completa e correta, tentarei resumir:
Em geral, a expressão:
não pode ser simplificado, porque o
variable
pode ser não declarado, portanto, a omissãotypeof(variable) != "undefined"
resultaria em ReferenceError. Mas, você pode simplificar a expressão de acordo com o contexto :Se
variable
for global , você pode simplificar para:Se for local , é possível evitar situações em que essa variável não é declarada e também simplificar:
Se for propriedade do objeto , você não precisa se preocupar com o ReferenceError:
fonte
navigator
parte dewindow
? Quando recebemos uma exceçãonavigator is not defined
, podemos usar owindow.navigator != null
teste?Você pode apenas verificar se a variável tem um valor ou não. Significado,
Se você não souber se existe uma variável (ou seja, se foi declarada), verifique com o operador typeof. por exemplo
fonte
Eu fiz isso usando esse método
salve o ID em alguma variável
então use if condition
fonte
Este é um exemplo de uma ocasião muito rara em que é recomendável usar em
==
vez de===
. A expressãosomevar == null
retornará true paraundefined
enull
, mas false para todo o resto (um erro se a variável não for declarada).Usar o
!=
botão irá inverter o resultado, como esperado.Editores modernos não avisam sobre o uso
==
ou!=
operadornull
, pois esse é quase sempre o comportamento desejado.Comparações mais comuns:
Tente você mesmo:
fonte
Conforme mencionado em uma das respostas, você pode ter sorte se estiver falando de uma variável que tem um escopo global. Como você deve saber, as variáveis que você define globalmente tendem a ser adicionadas ao objeto do Windows. Você pode aproveitar esse fato, digamos que esteja acessando uma variável chamada bleh, basta usar o operador invertido duplo (!!)
Isso retornaria um erro falso enquanto bleh não foi declarado E atribuiu um valor.
fonte
aqui está outra maneira de usar o método Array includes () :
fonte
qualquer que seja o yyy indefinido ou nulo, ele retornará true
sim
não
fonte
Abra as ferramentas do desenvolvedor no seu navegador e tente o código mostrado na imagem abaixo.
fonte
Para entender, vamos analisar qual será o valor retornado pelo mecanismo Javascript ao converter indefinido, nulo e '' (Uma sequência vazia também). Você pode verificar diretamente o mesmo no console do desenvolvedor.
Você pode ver que todos estão convertendo para false, significa Todos esses três estão assumindo 'falta de existência' por javascript. Portanto, você não precisa verificar explicitamente todos os três no seu código, como abaixo.
Também quero destacar mais uma coisa.
Qual será o resultado de Boolean (0)?
Claro que é falso. Isso criará um erro no seu código quando 0 for um valor válido no resultado esperado. Portanto, verifique isso ao escrever o código.
fonte
Semelhante ao que você tem, você poderia fazer algo como
if (some_variable === undefined || some_variable === null) { do stuff }
fonte
Testar nulidade (
if (value == null)
) ou não nulidade (if (value != null)
) é menos detalhado do que testar o status de definição de uma variável.Além disso, o teste
if (value)
(ouif( obj.property)
) para garantir a existência de sua variável (ou propriedade do objeto) falha se for definido com umfalse
valor booleano . Advertência emptor :)fonte
Ambos os valores podem ser facilmente distinguidos usando o operador de comparação estrita:
Exemplo de trabalho em:
http://www.thesstech.com/tryme?filename=nullandundefined
Código de amostra:
fonte
Se o objetivo da instrução if for verificar valores
null
ouundefined
antes de atribuir um valor a uma variável, você poderá fazer uso do Nullish Coalescing Operator , que estará finalmente disponível no JavaScript, embora o suporte ao navegador seja limitado. De acordo com os dados da caniuse , apenas 48,34% dos navegadores são suportados (a partir de abril de 2020).Isso garantirá que a variável seja atribuída a uma sequência vazia (ou qualquer outro valor padrão) se
some_variable
fornull
ouundefined
.Esse operador é mais adequado para o seu caso de uso, pois não retorna o valor padrão para outros tipos de valor falso, como
0
e''
.fonte
Você deve definir uma função deste formulário:
fonte
No ES5 ou ES6, se necessário, verifique-o várias vezes:
fonte
Com o Ramda, você pode simplesmente fazer com que a
R.isNil(yourValue)
Lodash e outras bibliotecas auxiliares tenham a mesma função.fonte