Como verificar uma variável não definida em JavaScript

913

Eu queria verificar se a variável está definida ou não. Por exemplo, o seguinte gera um erro não definido

alert( x );

Como posso pegar esse erro?

Jineesh
fonte
1
Esta não é uma duplicata da duplicata marcada. Resolução variável e resolução de propriedades de objetos são coisas muito diferentes. Uma duplicata melhor é como verificar se existe uma variável em javascript? .
RobG
Seu erro ocorre devido à variável não ser declarada. A maioria das respostas está focada na tarefa. Veja minha resposta para mais. Além disso, muitos deles afirmam incorretamente que nulos e indefinidos são objetos em JavaScript. Eles são primitivos , não objetos ...
JBallin

Respostas:

1691

Em JavaScript, nullé um objeto. Há outro valor para coisas que não existem undefined. O DOM retorna nullpara quase todos os casos em que falha em encontrar alguma estrutura no documento, mas no próprio JavaScript undefinedé o valor usado.

Segundo, não, não há um equivalente direto. Se você realmente deseja procurar especificamente por null:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Se você deseja verificar se existe uma variável, isso só pode ser feito com try/ catch, pois typeoftratará uma variável não declarada e uma variável declarada com o valor undefinedequivalente.

Mas, para verificar se uma variável é declarada e não é undefined:

if (yourvar !== undefined) // Any scope

Anteriormente, era necessário usar o typeofoperador para verificar indefinidamente com segurança, porque era possível reatribuir undefinedcomo uma variável. A maneira antiga era assim:

if (typeof yourvar !== 'undefined') // Any scope

O problema de undefinedser redesignável foi corrigido no ECMAScript 5, lançado em 2009. Agora você pode usar ===e !==testar com segurança undefinedsem usar, typeofcomo undefinedfoi somente leitura por algum tempo.

Se você deseja saber se um membro existe independente, mas não se importa com o seu valor:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Se você deseja saber se uma variável é verdadeira :

if (yourvar)

Fonte

Natrium
fonte
71
indefinido não é uma palavra reservada; você (ou o código de outra pessoa) pode fazer "undefined = 3" e isso interromperá dois dos seus testes.
13139 Jason S
6
"Se você sabe que a variável existe, mas não sabe se há algum valor armazenado nela" - hein ?!
13139 Jason S
36
Eu acho que ele está se referindo a uma variável declarada que não foi atribuída. por exemplo: var foo; // foo existe, mas não tem um valor
Wally Lawless
3
Hmmm ... Acabei de notar o link "fonte": todo esse post é uma citação direta de uma lista de discussão e provavelmente deve ser editado para deixar isso mais claro, pois o autor original não está disponível para esclarecer.
13339 Jason S
11
"No JavaScript, null é um objeto.", Isso não é verdade e, provavelmente, o culpado desse equívoco é o typeofoperador ( typeof null == 'object'). O nullvalor é um valor primitivo , que é o único valor do tipo Nulo .
CMS
347

A única maneira de testar verdadeiramente se uma variável é undefinedé fazer o seguinte. Lembre-se, indefinido é um objeto em JavaScript.

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

Algumas das outras soluções neste encadeamento farão com que você acredite que uma variável não está definida, mesmo que tenha sido definida (com um valor NULL ou 0, por exemplo).

Michael Wales
fonte
18
Como a pergunta NÃO É indefinida aqui deve ser do tipo someVar! == 'indefinido', certo?
eomeroff
1
Realmente, eu não penso assim que undefinded é um objeto, documentação de verificação primeiros developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus
2
O único teste que não produz a ReferenceError.
Nostalg.io
2
Este código está correto, mas acho que dizer que undefinedé um objeto em javascript é desinformação. Esta declaração está relacionada à sua resposta, afinal? É um valor undefineddo tipo undefined, atribuído ao identificador global nomeado undefined.
SimplGy 15/08/16
1
Agora isso está incorreto em termos de ser o único caminho. undefinedé somente leitura desde ES5. Você pode testar com segurança para o uso indefinido if (x === undefined) {...}ou usando abreviada assim: if (x === void 0).
Stephen M Irving
66

Tecnicamente, a solução adequada é (acredito):

typeof x === "undefined"

Às vezes, você pode ficar com preguiça e usar

x == null

mas isso permite que uma variável indefinida x e uma variável x contendo nulo retornem true.

Jason S
fonte
1
se você digitar var x;e, em seguida, typeof x;você receberá "undefined"apenas como se você feztypeof lakjdflkdsjflsj;
Muhammad Umer
Portanto, não há como verificar a variável indefinida, mas declarada?
Muhammad Umer
1
Acho que não; Não sei por que você gostaria.
Jason S
ujndefined não deve estar entre ápices
LowFieldTheory
o que você quer dizer com vértices?
Jason S
19

Uma versão ainda mais fácil e abreviada seria:

if (!x) {
   //Undefined
}

OU

if (typeof x !== "undefined") {
    //Do something since x is defined.
}
Dmitri Farkov
fonte
26
o primeiro código pode estar incorreto se x estiver sendo definido a partir de uma chamada de função. como x = A (); se A não retornar nada, ele retornará "indefinido" por padrão. Fazer a! X seria verdadeiro, o que seria logicamente correto. No entanto, se A () retornar 0, então! X deve ser falso como x = 0. No entanto, em JS,! 0 também é verdadeiro.
30909 Rajat
o segundo código pode ser abreviado para: if (! typeof (XX)) {...} else {...} #
Alejandro Silva
2
@AlejandroSilva Desculpe pela resposta tardia. Isso não funcionará, já que typeof retorna uma string, portanto retornará 'undefined' para uma variável indefinida, que por sua vez será avaliada como TRUE, levando a um falso positivo de uma var definida.
Dmitri Farkov
5
Por favor, se livrar do primeiro trecho, é ruim
Juan Mendes
1
Outros comentários apontaram que o primeiro exemplo é ruim, mas não claramente o porquê. Portanto, para quaisquer novos codificadores:! X não testa se x está definido, mas se é verdade. Strings, boolean true e números positivos são verdadeiros (e talvez eu esteja esquecendo algumas coisas), mas outros valores potencialmente válidos como 0, boolean false e uma string vazia não são verdadeiros. O primeiro exemplo pode funcionar para casos de uso específicos (por exemplo, testar uma string se você puder tratar vazio da mesma forma que o indefinido), mas devido aos muitos casos em que não será, não deve ser considerado a maneira padrão de verificar.
cfc
16

Eu já fiz muitas vezes:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
Joe
fonte
9
Considere alterar "==" para "===". Se você chamar doSomething (null), também receberá o alerta. A menos que seja isso que você deseja.
13139 Jason S
Sim. Você tem que decidir se deseja equivalente ou exatamente igual. Qualquer um dos casos pode ser útil.
21711 Joe
1
simplye cheque como this-> if (! typeof variableName == 'indefinido') {alert (variableName);}
Muhammad Sadiq
isso é inútil desde que você não será capaz de passar um var indefinido para uma função de qualquer maneira
avalanche1
2
Certamente você pode. Tente chamar uma função sem argumento.
1112 Joe
3

Você também pode usar o operador condicional ternário:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

John
fonte
E se var a = false;? Você deve verificar se, em a===undefinedvez disso
Iter Ator
1
Pergunta: verificar uma variável não definida ..... Esta é variável indefinida: var x; fazendo acima irá lançar um erro
Muhammad Umer
"Se a = false, ele mostrará" eu não sei 'a' "" - Esse é o problema, a questão é testar se está definido, não se é verdade. Se a for definido como falso, a não será indefinido. Isso retorna o resultado errado nesse caso. Veja meu comentário em stackoverflow.com/a/858270/2055492 para obter mais detalhes sobre por que essa abordagem não funciona.
cfc 14/11
não apenas !atestará true para undefined, mas também testará true para 0e nulle false. Isso está muito incorreto e deve ser removido.
Stephen M Irving
2

Costumo usar a maneira mais simples:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

EDITAR:

Sem inicializar a variável, a exceção será lançada "Uncaught ReferenceError: a variável não está definida ..."

mokiSRB
fonte
2
Uncaught ReferenceError: variable is not defined
Muhammad Umer
@MuhammadUmer, errado! variableé definido por var variable;. E esse trecho substituirá variableno escopo local. Ele pode quebrar a lógica que espera acessar um fechamento ou variável global. var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Ou
2

Outra "solução" em potencial é usar o windowobjeto. Evita o problema do erro de referência quando em um navegador.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}
ubershmekel
fonte
Isso não resolve a questão original e é totalmente irrelevante. Poster não estava perguntando como testar se algo é verdadeiro ou falso, ele perguntou como testar undefined. Isso não fará isso.
Stephen M Irving
2

O erro está dizendo que xisso nem existe! Não foi declarado , o que é diferente de ser atribuído um valor.

var x; // declaration
x = 2; // assignment

Se você declarasse x, não receberia um erro. Você receberia um alerta que diz undefinedporquex existe / tenha sido declarado, mas não foi atribuído um valor.

Para verificar se a variável foi declarada, você pode usar typeof, qualquer outro método para verificar se existe uma variável, gera o mesmo erro que você obteve inicialmente.

if(typeof x  !==  "undefined") {
    alert(x);
}

Isso está verificando o tipo do valor armazenado x. Ele retornará apenas undefinedquando xnão tiver sido declarado OU se tiver sido declarado e ainda não tiver sido atribuído.

JBallin
fonte
undefined é somente leitura desde o ES5 (versão 2009) e você não precisa mais do typeofoperador.
Stephen M Irving
2

O voidoperador retorna undefinedpara qualquer argumento / expressão passado para ele. para que você possa testar o resultado (na verdade, alguns minifiers alteram seu código de undefinedpara void 0para salvar alguns caracteres)

Por exemplo:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
svarog
fonte
Ding Ding! Essa é a resposta correta. Pena que é todo o caminho na parte inferior. Todo mundo está tão empolgado em continuar usando typeofe pensando undefinedpode ser transferido, o que não é possível há cerca de uma década.
Stephen M Irving
Isso também era seguro antes do ES5, porque naquela época, mesmo que você tivesse sido transferido undefined, pois Deus sabe apenas o motivo, o uso void 0sempre retornará undefinedindependentemente.
Stephen M Irving
1

Podemos verificar da undefinedseguinte forma

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}
Arshid KV
fonte
1

Basta fazer algo como abaixo:

function isNotDefined(value) {
  return typeof value === "undefined";
}

e chame assim:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
Alireza
fonte
0

A resposta aceita está correta. Só queria adicionar mais uma opção. Você também pode usar o try ... catchbloco para lidar com essa situação. Um exemplo esquisito:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Esteja ciente do catchbloco, que é um pouco confuso, pois ele cria um escopo no nível do bloco. E, é claro, o exemplo é extremamente simplificado para responder à pergunta, não abrange as práticas recomendadas no tratamento de erros;).

Евгений Савичев
fonte
0

Uso uma função pequena para verificar se uma variável foi declarada, o que realmente reduz a quantidade de lixo nos meus arquivos javascript. Eu adiciono uma verificação do valor para garantir que a variável não exista apenas, mas também tenha sido atribuído um valor. A segunda condição verifica se a variável também foi instanciada, porque se a variável foi definida, mas não instanciada (veja o exemplo abaixo), ainda gerará um erro se você tentar fazer referência ao valor no seu código.

Não instanciado - var my_variable;Instanciado -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

Você pode usar uma instrução condicional para testar se a variável foi definida e instanciada dessa maneira ...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

ou para testar se não foi definido e instanciado o uso ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
MistyDawn
fonte
1
Por que não devolver seu predicado imediatamente? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski