Como posso determinar se uma variável é 'indefinida' ou 'nula'?
Como determino se a variável é undefinedou null?
Mas se eu fizer isso, o intérprete JavaScript interrompe a execução.
— sadmicrowave
Possível duplicata de Como você verifica uma string vazia em JavaScript?
Você pode usar as qualidades do operador de igualdade abstrata para fazer isso:
Porque null == undefinedé verdade, o código acima irá pegar ambos nulle undefined.
Estou tentando testar se o evento é nulo no firefox e um erro bloqueia a execução: "evento é indefinido"
— Entretoize
@MichaelFever Como isso não funciona? Copie e cole no seu console: const y = undefined; y == null;Ele deve retornartrue
— Seraf
@ChrisStryczynski No exemplo do seu comentário, você declarou yconstante, mas deseja comparar abc(não y). Quando testei yvia console.log(y == null);Chrome e Firefox, obtive truecomo resultado. Se você encontrou um erro, talvez tenha tentado usar o operador de atribuição em =vez da comparação, o ==que faria sentido retornar um erro, pois constnão pode ser reatribuído.
— Pshemo 17/04/19
exemplo ao vivo de comparações relevantes. lgtm.
@ZaytsevDmitry, por que você esperaria um teste se uma variável for nullou será undefinedaprovado se a variável for igual 0? A questão não é sobre o teste de um valor verdadeiro, mas sim o teste explícito de nullou undefined.
— Rodrigo-silveira
A maneira padrão de capturar nulle undefinedsimultaneamente é esta:
--qual é 100% equivalente ao mais explícito, mas menos conciso:
Ao escrever JS profissional, é dado como certo que a igualdade de tipo e o comportamento de ==vs=== são entendidos. Portanto, usamos ==e apenas comparamos com null.
Edite novamente
Os comentários sugerindo o uso de typeofestão simplesmente errados. Sim, minha solução acima causará um ReferenceError se a variável não existir. Isto é uma coisa boa. Este ReferenceError é desejável: ajudará você a encontrar seus erros e corrigi-los antes de enviar seu código, assim como os erros do compilador em outros idiomas. Use try/ catchse você estiver trabalhando com informações sobre as quais não tem controle.
Você não deve ter nenhuma referência a variáveis ​​não declaradas no seu código.
— temporary_user_name
Isso causará um ReferenceError e interromperá a execução se a variável não for definida ou referida no código, usando typeof é mais seguro.
— Mani Gandham
Esse é mais um ponto estilístico. Se a variável não foi declarada em todos , isso é realmente apenas má escrita por parte do autor. Você deve saber se sua variável foi declarada ou não, isso não deve ser uma pergunta. Mas sim , se por algum motivo esse for o caso, isso deve ser alterado para window.variable em vez de apenas variável , o que não causará um erro de referência. Typeof deve ser evitado.
Sim, porque você escreveu em !==vez de !=.
-OP: A afirmação de que essas comparações são "100% equivalentes" está SIMPLESMENTE ERRADA, como você observou em sua própria edição, a segunda causará um erro de referência. Quanto à afirmação: "Você não deve ter referências a variáveis ​​não declaradas no seu código". MESMO? Já ouviu falar de parâmetros opcionais? jsfiddle.net/3xnbxfsu
— Timothy Kanski
Os parâmetros opcionais do @TimothyKanski podem ser indefinidos se opcionalmente não forem fornecidos, mas são definitivamente variáveis ​​declaradas. Eles são declarados e ter um valor de undefined, como qualquer declarada mas variável não inicializada seria, ou seja, var someVar;para que o seu argumento não realmente realizar-se
— chiliNUT
Combinando as respostas acima, parece que a resposta mais completa seria:
Isso deve funcionar para qualquer variável que não seja declarada ou declarada e definida explicitamente como nula ou indefinida. A expressão booleana deve ser avaliada como false para qualquer variável declarada que tenha um valor não nulo real.
— jkindwall
@Aerovistae Eu reconheço que typeofé um operador, não uma função, por isso não precisa dos parênteses, mas eu aprecio os parênteses, no entanto - simplesmente por ter clareza na leitura.
— user664833
que tal verificar diretamente se (variável === indefinida) em vez de usar typeof?
— Frozen Crayon
@ArjunU que causará um ReferenceError se a variável não for declarada. Se você não souber se uma variável foi declarada ou não, use a solução acima. Se você pode garantir que a variável seja pelo menos declarada, você pode usarvariable == null
Esta é uma solução melhor porque, como o @Rogue apontou, a variável pode não ser declarada.
— Abdul Sadik Yalcin
Corrija-me se eu estiver errado, mas o primeiro condicional não é um superconjunto do segundo e, portanto, o segundo condicional é supérfluo?
Caso alguém pense que essa é outra meia resposta, isso realmente funciona. undefinedavalia igual a null.
Falha ao me em cromo consola ... ReferenceError: variável não é definida, por isso pode funcionar, mas não para mim ...
Ele funciona apenas para variáveis ​​declaradas, não variáveis ​​que podem ou não ser declaradas, o que raramente é o caso. (Você precisa usar typeof + uma verificação nula para esse caso)
Acabei de descobrir que você pode adicionar este comentário: /*jshint eqnull:true */na parte superior do seu documento ou função JS, e o JSHint deixará de avisá-lo sobre seus usos == null.
@ Aerovistae, você pode me indicar uma referência que declare explicitamente que ==está quebrado. O coercitivo if(variable == null)nesta resposta faz todo o sentido para mim ...
será avaliado como true se o valor não for:
sequência vazia ("")
Eu acho que essa é uma técnica perigosa que se espalhou como fogo selvagem. Porque muitas das variáveis ​​verificadas podem ser booleanas ou números. Portanto, se o usuário não entender completamente as consequências, isso não será bom.
Por favor, forneça uma referência deste ESPECIFICAÇÃO javascript
— villamejia
É o mesmo que if (EmpName). Se já undefinedvai ser falso.
Se a variável não estiver definida. então se (EmpName) gerará erro #
— Thamaraiselvam 12/11
@Thamaraiselvam Acho que Rudy pode ter falado sério var EmpName; if (EmpName). Onde a variável é definida, mas não é atribuída um valor.
— Hungerstar 16/11/16
A attr()função jQuery retorna uma string em branco ou o valor real (e nunca nullou undefined). A única vez que retornaundefined é quando o seletor não retorna nenhum elemento.
Então, você pode querer testar uma string em branco. Como alternativa, como cadeias em branco, nulas e indefinidas são falsas, você pode fazer isso:
— Chetan Sastry
O Chrome 17.0.963.78 m fornece este erro:ReferenceError: EmpName is not defined
@EranMedan Eu sei que é tarde, mas espero que ajude as pessoas que vierem aqui mais tarde. O motivo pelo qual você recebe um erro é porque ele não foi declarado. Normalmente, você gostaria que EmpName (ou alguma outra variável) fosse passado para uma função ou o valor de retorno de outra função e, portanto, declarado (Exemplo: "var x;"). Para testar se ele retornou uma sequência indefinida, nula ou em branco, você pode usar a solução acima.
— 26513 Dave
Sei que essa é uma pergunta fria, mas o jQuery retornará undefinedse o atributo não existir no elemento (não apenas se o seletor não tiver elementos correspondentes, conforme a resposta). Por exemplo, um imgsem srcretornaria undefinedpara$('img').attr('src');
— codinghands 21/08/18
Eu vim para escrever minha própria função para isso. JavaScript é estranho.
É utilizável em literalmente qualquer coisa. (Observe que isso também verifica se a variável contém algum valor utilizável . Mas, como essas informações geralmente também são necessárias, acho que vale a pena postar). Por favor, considere deixar uma nota.
Compatível com TypeScript.
Esta função deve fazer exatamente a mesma coisa que a empty()função do PHP (consulteRETURN VALUES )
Considera undefined, null, false, 0, 0.0, "0" {}, []como esvaziar.
"0.0", NaN, " ", trueSão considerados não-vazia.
Corri para um pequeno problema de verificação nula. Quero verificar se um parâmetro que está sendo passado é nulo ou se é um objeto vazio { }. Este é um problema de linguagem comum e tolo, mas eu tinha esquecido. Todas as minhas pesquisas mostram respostas para valores nulos indefinidos ou comparações fracas de igualdade (==), mas não para uma igualdade estrita (===) ou equivalente. E então aqui, na sua resposta em -1, na parte inferior da página (antes de eu votar), está a resposta que me escapou. Object.keys( obj ).length < 1ou talvez === 0, assumindo que nunca será -1. De qualquer forma, votou para 0, woo. : p
Obrigado, consegui soltar essa função e limpar muito código. Por que essa não é uma função JS padrão está além de mim.
Você deve mudar tudo do seu ==para ===aqui, então isso seria uma função razoável.
— Ben McIntyre
Se a variável que você deseja verificar for global, faça
Essa maneira de verificar não gera um erro, mesmo que a yourVarNamevariável não exista.
Exemplo: quero saber se meu navegador suporta a API do histórico
windowé um objeto que contém todas as variáveis ​​globais como suas propriedades e, em JavaScript, é legal tentar acessar uma propriedade de objeto não existente. Se historynão existir, window.historyretornará undefined. undefinedé falsey, portanto, o código em um if(undefined){}bloco não será executado.
Os leitores devem observar que uma abordagem como essa é idiomática para verificar - do JavaScript em execução no navegador - se uma variável global foi declarada e, principalmente, se uma global fornecida pelo navegador (como a API de histórico) está disponível. Ele não funcionará para verificar se uma variável não global é nullou undefinednão, nem seu JavaScript está sendo executado fora de um navegador (por exemplo, no Node.js.). Vai também globals tratar definida como 0, falseou ''o mesmo que aqueles que são não declaradas ou undefinedou null, o que é geralmente bem.
Isso pressupõe que o script esteja sendo executado em um navegador. Isso não é um dado.
O mais curto e fácil:
isso avaliará true se EmpName for:
corda ("")
— userPlus
O caso de uso aqui é que eu quero saber a diferença entre indefinido e falso. Vou usar a verificação nula então.
— gast128
Provavelmente, a maneira mais curta de fazer isso é:
E aqui estão mais detalhes sobre ==(fonte aqui )
BÔNUS : o motivo pelo qual ===é mais claro do que ==(veja a resposta agc )
Acabei de ter esse problema, ou seja, verificar se um objeto é nulo.
Eu simplesmente uso isso:
— Welshboy
seria melhor definir var A = document.getElementById ("enterJob") if (A) A.className + = 'current'; Dessa forma, você trabalha 50% com o mesmo resultado ... Mas talvez você tenha feito isso apenas para shows e depois eu saúdo.
Como você está usando jQuery , é possível determinar se uma variável é indefinida ou se seu valor é nulo usando uma única função.
Isto não funcionou para mim. Ainda recebi o erro: ReferenceError: s is not definedpara o primeiro exemplo.
O elemento de verificação do jQuery não é nulo:
Em JavaScript, de acordo com meu conhecimento, podemos verificar uma variável indefinida, nula ou vazia, como abaixo.
Verifique todas as condições:
— DevAelius
varé uma palavra reservada, isso vai darSyntaxError
— dhilt 16/03
Você pode simplesmente usar o seguinte (eu sei que existem maneiras mais curtas de fazer isso, mas isso pode facilitar a observação visual, pelo menos para outras pessoas que olham o código).
A maneira mais fácil de verificar é:
— M. Arnold
Isso executará o código se a variável tiver um valor de false, o que é potencialmente indesejável.
— Byjor
A pergunta é clara "Como determinar se a variável é 'indefinida' ou 'nula'?" e em javascript, se uma variável tiver um valor nulo ou indefinido, seu valor será falso.
— 317 Arnold M. Arnold
Desculpe, mas isso está incorreto. Aqui está um JSfiddle para provar isso.
— byxor
Por sua resposta, undefined, null e algumas outras coisas como cadeia vazia, +0, -0 NaNe falsepassar. !operador coage o operand- aqui variable- para booleana: ecma-international.org/ecma-262/#sec-toboolean
Mas verifique a pergunta: "Como determinar se uma variável é indefinida ou nula", a! O operando usado com um if sempre retornará true se a variável for nula ou indefinida.
— 314 Arnold M. Arnold
Com a solução abaixo:
Eu posso verificar o seguinte:
— Tony Tai Nguyen
Isso não responde à pergunta, que é "como capturar nulo e indefinido?" não "como faço para pegar todos os valores falsey no JavaScript?"
@ Aerovistae, eu pensei que fiz com console.log (isDeepEqual (null, null)); e console.log (isDeepEqual (indefinido, indefinido)); ?
Para testar se uma variável é nula ou indefinida, uso o código abaixo.
— DanKodi
Perto, mas não. Perca typeofe compare com a undefinedlinha reta, não como uma corda. Isso funciona, mas o operador extra não tem efeito a não ser torná-lo mais detalhado.
Nesse caso, sim, você está certo, não precisamos usar typeof. Mas é uma boa prática usar typeof quando estiver lidando com variáveis ​​indefinidas. Um motivo para usar typeof é que ele não gera um erro se a variável não tiver sido declarada.
Isso é realmente uma coisa ruim. Você não deseja variáveis ​​não declaradas no seu código. Você deseja lançar um ReferenceError para encontrar a variável e declará-la. Certamente você não tentaria isso em uma linguagem compilada como C ++! Só porque o JS permite, não significa que deva ser feito.
Sua declaração ou é inversa. Verificar se algo está indefinido seria o primeiro passo, não o segundo.
— Anthony Rutledge
Eu executo este teste no console do Chrome. Usando (vazio 0), você pode verificar indefinido:
Vamos olhar para isso,
Acima, a variável é declarada apenas como apple. Nesse caso, se chamarmos método, alertele será exibido indefinido.
No segundo, ele exibe nulo, porque a variável de applevalor é nula.
Portanto, você pode verificar se um valor é indefinido ou nulo.
— Anjana Kumari
Melhor maneira:
— Nishanth Matha
Esta solução exata já foi fornecida por @jkindwall em 11 de outubro de 2013. stackoverflow.com/a/19323555/2943403 Esta postagem somente de código é completamente inútil porque não agrega nenhum novo valor à página. De fato, está adicionando inchaço à página e desperdiçando tempo dos pesquisadores em lê-la. Por favor, remova esta resposta.
Porque === verifica o tipo e o valor. O tipo de ambos é diferente, mas o valor é o mesmo.
— Franklin Pious
O que acontece se o usuário digitar a palavra 'indefinido'?
Sua pergunta é boa, mostra que a condição é verdadeira e, portanto, precisamos alterar a opção normal indefinida para o tipo de condição. @Chuck
Isto está errado. typeofnunca cederá undefined, apenas a corda 'undefined'. Além disso, i == nulljá é verdade se ié undefined, portanto, o segundo booleano seria redundante, mesmo que funcionasse.
Esta solução (com as condições revertidas) já foi fornecida por @jkindwall em 11 de outubro de 2013. stackoverflow.com/a/19323555/2943403 Esta postagem somente de código é completamente inútil porque não agrega nenhum novo valor à página. De fato, está adicionando inchaço à página e desperdiçando tempo dos pesquisadores em lê-la. Por favor, remova esta resposta.
A foo == nullverificação deve executar o truque e resolver o caso "indefinido OU nulo" da maneira mais curta. (Não considerando o caso "foo não é declarado".) Mas as pessoas que costumam ter 3 iguais (como a melhor prática) podem não aceitá-lo. Basta olhar para eqeqeq ou triple-iguais em eslint e tslint ...
A abordagem explícita, quando estamos verificando se uma variável é undefinedou nullseparadamente, deve ser aplicada neste caso, e minha contribuição para o tópico (27 respostas não negativas por enquanto!) É usar void 0como uma maneira curta e segura de executar a verificação para undefined.
O uso foo === undefinednão é seguro porque indefinido não é uma palavra reservada e pode ser sombreada ( MDN ). O uso do typeof === 'undefined'cheque é seguro, mas se não vamos nos importar com o caso não declarado, a seguinte abordagem pode ser usada:
se você criar uma função para verificá-la:
Chamar typeof null retorna um valor de "objeto", pois o valor especial nulo é considerado uma referência de objeto vazio. O Safari da versão 5 e o Chrome da versão 7 têm uma peculiaridade em que chamar typeof em uma expressão regular retorna "function", enquanto todos os outros navegadores retornam "object".
— Jones Agyemang
Você só pode usar o segundo: pois ele verificará tanto a definição quanto a declaração
Ainda acho que a melhor maneira / segura de testar essas duas condições é converter o valor em uma string:
— n1kkou
você pode explicar por que acredita que esta é a "melhor maneira / segura" de realizar os testes?
Como a conversão está sempre retornando uma string "padronizada" (ou seja, [objeto Indefinido]), você não terá problemas ao testar valores falsos. Essa é apenas a minha opinião com base em experiências que tive com valores de verdade / falsidade.
— N1kkou 31/05
Obrigada pelo esclarecimento. Não estou criticando, é uma resposta interessante, só queria que você fornecesse algumas explicações para os outros sobre por que isso é potencialmente superior a outros métodos.
Não se preocupe! Eu tive muitos problemas com esse tipo de comparação e, até agora, considero a abordagem mais útil para esse assunto.
Você pode verificar se o valor é indefinido ou nulo usando simplesmente typeof:
Veja os comentários na resposta anterior ( stackoverflow.com/a/21273362/6305294 ) sobre o typeof.
— 287 Alex
Isto está incorreto. Não pega null. Não entendo por que respostas novas e incorretas estão sendo fornecidas a uma pergunta que recebeu uma resposta correta e completa há muitos anos. Você acha que as respostas atuais são de alguma forma insuficientes?
if(x==null)é uma má ideia em JavaScript. Julgue com "=="- pode causar uma coerção inesperada do tipo e não pode ser lida pelo CoffeeScript, nunca use "==" ou "! =" No julgamento da condição!
if(x)será melhor, mas tenha cuidado com 0 e "" . Será tratado como falso , e não o método igual com "!= null"é verdadeiro .
Consulte Práticas recomendadas para JavaScript .
— Albert.Qing
Isso é completamente incorreto, e o estudo superficial de qualquer estrutura ou software de nível profissional comprovará isso em alguns momentos. Usar ==para comparar nullé a maneira padrão de captura nulle undefinedem JS. A coerção de tipo com ==não é um risco nesse contexto específico e, de fato, está sendo aproveitada para atingir o objetivo de capturar ambos nulle undefinedsimultaneamente. Gaste mais tempo trabalhando com o idioma antes de optar por oferecer respostas incorretas e enganosas a perguntas que foram resolvidas satisfatoriamente anos atrás.