Como posso determinar se uma variável é 'indefinida' ou 'nula'?


2131

Como determino se a variável é undefinedou null?

Meu código é o seguinte:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

Mas se eu fizer isso, o intérprete JavaScript interrompe a execução.


Respostas:


2851

Você pode usar as qualidades do operador de igualdade abstrata para fazer isso:

if (variable == null){
    // your code here.
}

Porque null == undefinedé verdade, o código acima irá pegar ambos nulle undefined.


5
Estou tentando testar se o evento é nulo no firefox e um erro bloqueia a execução: "evento é indefinido"
Entretoize

3
@MichaelFever Como isso não funciona? Copie e cole no seu console: const y = undefined; y == null;Ele deve retornartrue
Seraf

2
@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

2
exemplo ao vivo de comparações relevantes. lgtm.
Ryan Haining

2
@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

1108

A maneira padrão de capturar nulle undefinedsimultaneamente é esta:

if (variable == null) {
     // do something 
}

--qual é 100% equivalente ao mais explícito, mas menos conciso:

if (variable === undefined || variable === null) {
     // do something 
}

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.


47
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

56
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.
temporary_user_name

6
Sim, porque você escreveu em !==vez de !=.
temporary_user_name

9
-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

16
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

228

Combinando as respostas acima, parece que a resposta mais completa seria:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

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.


2
@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

1
que tal verificar diretamente se (variável === indefinida) em vez de usar typeof?
Frozen Crayon

2
@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
Rogue

3
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?
March Ho

187
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

14
Caso alguém pense que essa é outra meia resposta, isso realmente funciona. undefinedavalia igual a null.
Chuck

3
Falha ao me em cromo consola ... ReferenceError: variável não é definida, por isso pode funcionar, mas não para mim ...
Eran Medan

48
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)

11
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.
Web_Designer

3
@ 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 ...
Ben Aston

94
if (typeof EmpName != 'undefined' && EmpName) {

será avaliado como true se o valor não for:

  • nulo

  • Indefinido

  • NaN

  • sequência vazia ("")

  • 0 0

  • falso


13
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.
usar o seguinte código

Por favor, forneça uma referência deste ESPECIFICAÇÃO javascript
villamejia

1
É o mesmo que if (EmpName). Se já undefinedvai ser falso.
Rudy

1
Se a variável não estiver definida. então se (EmpName) gerará erro #
Thamaraiselvam 12/11

1
@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

28

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:

if (!EmpName) { //do something }

1
O Chrome 17.0.963.78 m fornece este erro:ReferenceError: EmpName is not defined
Eran Medan

6
@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

20

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.

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

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.


2
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.
Andy

3
Você deve mudar tudo do seu ==para ===aqui, então isso seria uma função razoável.
Ben McIntyre

13

Se a variável que você deseja verificar for global, faça

if (window.yourVarName) {
    // Your code here
}

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

if (window.history) {
    history.back();
}

Como isso funciona:

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.


2
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.
Mark Amery

Isso pressupõe que o script esteja sendo executado em um navegador. Isso não é um dado.
GreenAsJade

13

O mais curto e fácil:

if(!EmpName ){
 // DO SOMETHING
}

isso avaliará true se EmpName for:

  • nulo
  • Indefinido
  • NaN
  • esvaziar
  • corda ("")
  • 0 0
  • falso

3
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

12

Provavelmente, a maneira mais curta de fazer isso é:

if(EmpName == null) { /* DO SOMETHING */ };

Aqui está a prova:

E aqui estão mais detalhes sobre ==(fonte aqui )

Digite a descrição da imagem aqui

BÔNUS : o motivo pelo qual ===é mais claro do que ==(veja a resposta agc )

Digite a descrição da imagem aqui


9

Acabei de ter esse problema, ou seja, verificar se um objeto é nulo.
Eu simplesmente uso isso:

if (object) {
    // Your code
}

Por exemplo:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
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.
Harry Svensson

8

Como você está usando jQuery , é possível determinar se uma variável é indefinida ou se seu valor é nulo usando uma única função.

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;

Isto não funcionou para mim. Ainda recebi o erro: ReferenceError: s is not definedpara o primeiro exemplo.
Mark

6

O elemento de verificação do jQuery não é nulo:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}

5

Em JavaScript, de acordo com meu conhecimento, podemos verificar uma variável indefinida, nula ou vazia, como abaixo.

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

Verifique todas as condições:

if(variable === undefined || variable === null || variable === ''){
}

varé uma palavra reservada, isso vai darSyntaxError
dhilt 16/03

5

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).

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

4

A maneira mais fácil de verificar é:

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}

1
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

1
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
Alireza

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

3

Com a solução abaixo:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

Eu posso verificar o seguinte:

  • nulo
  • Indefinido
  • NaN
  • esvaziar
  • corda ("")
  • 0 0
  • falso

Isso não responde à pergunta, que é "como capturar nulo e indefinido?" não "como faço para pegar todos os valores falsey no JavaScript?"
temporary_user_name

@ Aerovistae, eu pensei que fiz com console.log (isDeepEqual (null, null)); e console.log (isDeepEqual (indefinido, indefinido)); ?
Tony Tai Nguyen

2

Para testar se uma variável é nula ou indefinida, uso o código abaixo.

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }

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.
temporary_user_name

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.
DanKodi

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.
temporary_user_name

1
Sua declaração ou é inversa. Verificar se algo está indefinido seria o primeiro passo, não o segundo.
Anthony Rutledge

2

Eu executo este teste no console do Chrome. Usando (vazio 0), você pode verificar indefinido:

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined

2

Vamos olhar para isso,

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined

    Acima, a variável é declarada apenas como apple. Nesse caso, se chamarmos método, alertele será exibido indefinido.

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null

No segundo, ele exibe nulo, porque a variável de applevalor é nula.

Portanto, você pode verificar se um valor é indefinido ou nulo.

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}

1

Melhor maneira:

if(typeof variable==='undefined' || variable===null) {

/* do your stuff */
}

6
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.
Mickmackusa

1
(null == undefined)  // true

(null === undefined) // false

Porque === verifica o tipo e o valor. O tipo de ambos é diferente, mas o valor é o mesmo.


1
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}

3
O que acontece se o usuário digitar a palavra 'indefinido'?
Chuck

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
KARTHIKEYAN.A

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.
temporary_user_name

1
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.
Mickmackusa

1

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:

if (foo === void 0 || foo === null) { ... }

1

se você criar uma função para verificá-la:

export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}

-1

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".


-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

Você só pode usar o segundo: pois ele verificará tanto a definição quanto a declaração


-1

Ainda acho que a melhor maneira / segura de testar essas duas condições é converter o valor em uma string:

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}

você pode explicar por que acredita que esta é a "melhor maneira / segura" de realizar os testes?
Sadmicrowave

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.
Sadmicrowave

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.
N1kkou 31/05

-2

Você pode verificar se o valor é indefinido ou nulo usando simplesmente typeof:

if(typeof value == 'undefined'){

Veja os comentários na resposta anterior ( stackoverflow.com/a/21273362/6305294 ) sobre o typeof.
287 Alex

4
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?
temporary_user_name

-4

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 .

Digite a descrição da imagem aqui

Consulte Práticas recomendadas para JavaScript .


3
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.
temporary_user_name

evite "==". Tudo está sempre mudando, eu não concordo com você @Aerovistae
Albert.Qing

3
Você não discorda de mim - você discorda de todo o estabelecimento JavaScript. Sejamos claros.
temporary_user_name
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.