A variável existe, mas parece que não? Entendendo as verificações em JavaScript
\n\nVocê já escreveu um script, o executou, e de repente — bum! — o console do navegador fica vermelho com o grito Uncaught ReferenceError: myVar is not defined? Familiar. Ou o contrário: a variável foi declarada, mas você não tem certeza se um valor foi atribuído a ela. Em JavaScript, esses dois conceitos ("existe" e "inicializada") são frequentemente confundidos até mesmo por desenvolvedores experientes.
Neste guia, vamos entender de uma vez por todas como verificar corretamente se uma variável existe em JavaScript, qual a diferença entre "definida" e "inicializada", e como evitar 90% dos erros relacionados a undefined e ReferenceError. Vamos lá!
Resumindo: o que significa "a variável existe"?
\n\nEm JavaScript, uma variável tem três estados:
\n\n- \n
- Não declarada (undeclared) — a variável simplesmente não existe na memória. Tentar acessá-la resultará em
ReferenceError. \n - Declarada, mas não inicializada (declared, but undefined) — escrevemos
let x;ouvar y;, mas não atribuímos um valor. A variável existe, seu tipo éundefined. \n - Declarada e inicializada (declared and initialized) — a variável tem um valor específico (número, string, objeto, etc.). \n
A maioria das perguntas no Stack Overflow (e são milhares) se resume a uma: "Como saber se uma variável não causará um erro ao ser acessada?" A resposta — use typeof. Mas há nuances. Vamos entender.
Método nº1. Operador typeof — seu melhor amigo
\n\nA maneira mais segura e confiável de verificar se uma variável está definida em JavaScript é o operador typeof. Sua principal vantagem: ele nunca lança um erro, mesmo que a variável não seja declarada.
Exemplo para variável não declarada
\n\n// A variável myVar não foi declarada\nif (typeof myVar !== 'undefined') {\n console.log('A variável existe!');\n} else {\n console.log('A variável NÃO existe ou seu valor é undefined');\n}\n// Saída: "A variável NÃO existe ou seu valor é undefined"\n\nObserve: typeof retorna a string 'undefined' tanto para uma variável não declarada quanto para uma declarada, mas não inicializada (let x;). Isso é bom e ruim. Bom — porque não pegamos um erro. Ruim — porque não diferenciamos esses dois casos.
Exemplo para variável declarada, mas vazia
\n\nlet myVar; // declarada, mas não inicializada\nconsole.log(typeof myVar); // "undefined" — também undefined!\n\nif (typeof myVar !== 'undefined') {\n console.log('A variável existe e tem um valor');\n} else {\n console.log('A variável é undefined (ou não foi declarada, ou não foi inicializada)');\n}\n\nConclusão: typeof é a solução ideal se você precisa apenas evitar o ReferenceError. Se precisar distinguir entre "não declarada" e "vazia" — continue lendo.
Método nº2. Verificação via window (contexto global)
\n\nSe você está trabalhando no navegador e a variável foi declarada globalmente (via var ou implicitamente), ela se torna uma propriedade do objeto window. Isso abre possibilidades adicionais para verificar a existência da variável.
Usando o operador in
\n\n// Variável global\nvar globalVar = 42;\n\nconsole.log('globalVar' in window); // true\nconsole.log('nonExistentVar' in window); // false\n\nEste método funciona apenas para variáveis globais declaradas com var ou atribuídas sem palavra-chave. let e const não criam propriedades do objeto window (elas vivem no escopo de bloco).