O Mistério do Undefined: Por que ele quebra seu código?

10/03/20266 min de leitura
O Mistério do Undefined: Por que ele quebra seu código?

O que é undefined no JavaScript e como parar de sofrer com ele

Fala, galera! Aqui é o Murilo, redator do ChaveMestra, e hoje a gente vai falar sobre um dos maiores traumas de quem mexe com desenvolvimento web. Se você programa em JavaScript, com certeza já quis jogar o notebook pela janela ao ler a palavra undefined brilhando no console do navegador, acompanhada daquela mensagem de erro vermelha que parece rir da sua cara. Na real, o undefined é aquele tipo de coisa que todo mundo vê todo dia, mas pouca gente para pra entender de verdade o que o motor do JS tá querendo dizer quando cospe isso na nossa frente.

Cara, semana passada eu tava aqui no meu setup em São Paulo, curtindo aquela garoa clássica e tentando rodar um script simples de automação pra minha cafeteira (sim, sou desses que tenta automatizar até o café da manhã pra ganhar cinco minutos de sono). Tudo parecia lindo, as rotas tavam ok, a lógica fazia sentido na minha cabeça, mas toda vez que o script chegava na parte de checar a temperatura, o console gritava: 'TypeError: cannot read property status of undefined'. Eu olhei pro código, o código olhou pra mim, e a gente ficou uns dez minutos naquela encarada de faroeste. O erro tava lá, mas por que diabos aquela variável tava vazia se eu tinha certeza de que tinha passado o valor? Você já passou por isso? Quanto tempo você já desperdiçou tentando achar onde aquela variável se perdeu no meio do caminho?

O que diabos é undefined, afinal?

Pra começar a entender a treta, a gente precisa olhar pro básico. No JavaScript, o undefined é um valor primitivo que o sistema atribui automaticamente a qualquer variável que foi declarada, mas ainda não recebeu um valor. É tipo quando você reserva uma mesa num restaurante: a mesa tá lá, o espaço existe, mas não tem ninguém sentado nela ainda. O lugar tá 'indefinido'.

Muita gente confunde o undefined com o null, mas a diferença é crucial. Olha, pensa assim: o undefined é uma ausência não intencional (ou inicial), enquanto o null é quando você, o programador, decide ativamente que aquela variável deve estar vazia. É como uma caixa de encomenda: o undefined é a caixa que você esqueceu de colocar o produto dentro antes de fechar, e o null é a caixa que você enviou vazia de propósito por algum motivo bizarro. Tá ligado?

Undefined vs Null: A eterna briga de bar

Essa é a discussão que não acaba nunca nos fóruns do Stack Overflow. Se a gente der um typeof no undefined, o retorno é 'undefined'. Mas se a gente der um typeof no null, o retorno é 'object'. Pera, o quê? Pois é, isso é um erro histórico do JavaScript que nunca foi corrigido pra não quebrar a internet inteira, mas ajuda a entender que eles são tratados de formas diferentes pelo motor da linguagem.

Na real, o undefined surge em três situações principais que você precisa decorar pra não passar vergonha no code review:

1. Variáveis sem valor inicial

Se você mandar um let x; e logo depois um console.log(x);, o resultado vai ser undefined. O JS criou o espaço na memória, mas como você não disse o que colocar lá, ele preencheu com o valor padrão de 'não sei o que é isso ainda'.

2. Funções que não retornam nada

Toda função no JavaScript retorna alguma coisa. Se você não colocar um return lá no final, ela vai retornar, adivinha só? Isso mesmo, undefined. É um erro super comum: você faz todo o cálculo complexo dentro da função, mas esquece de devolver o resultado pra quem chamou. Aí quando você vai usar o resultado em outra parte do código, tudo quebra.

3. Acessar propriedades de objetos que não existem

Sabe quando você tenta pegar o usuario.telefone, mas o objeto usuario só tem nome e email? O JS não vai explodir seu código na hora, ele só vai te dizer que o telefone é undefined. O problema é que, se você tentar fazer algo com esse telefone (tipo usuario.telefone.ddd), aí sim o erro 'cannot read property of undefined' aparece e acaba com o seu dia.

Como evitar que o seu código quebre

Hoje em dia, a gente tem ferramentas maravilhosas pra lidar com esse fantasma. Uma das minhas favoritas é o Optional Chaining, aquele ponto de interrogação maroto que a gente coloca antes de acessar uma propriedade (usuario?.telefone?.ddd). Isso faz com que, se qualquer parte do caminho for undefined, o código pare ali e retorne undefined em vez de travar a aplicação inteira. É como ter um seguro de vida pro seu código.

Outra técnica matadora é usar valores padrão com o operador de coalescência nula (??). Você pode dizer pro código: 'Ei, pega o valor dessa variável, mas se ela for undefined ou null, usa esse valor padrão aqui'. É tipo ter um plano B sempre engatilhado. Quanto tempo você já desperdiçou escrevendo vários ifs pra checar se uma variável existia? Com essas ferramentas modernas, você resolve isso em uma linha.

Falando em recursos pra se desenvolver mais rápido: se você tá aprendendo programação e quer materiais organizados — desde tutoriais de JavaScript até cursos completos de desenvolvimento web que fora daqui custariam algumas centenas de reais — o ChaveMestra tem esse tipo de conteúdo reunido em um só lugar, sem precisar garimpar em dezenas de sites diferentes. Vale muito a pena dar uma olhada.

A analogia da caixa vazia

Para fixar de vez: imagine que você está organizando sua estante de jogos. Você tem um espaço reservado para o 'GTA VI'.

  • Se você tem o espaço, mas o jogo ainda não foi lançado e você não colocou nada lá, esse espaço está undefined.
  • Se você decidiu que não quer mais o jogo e colocou uma etiqueta de 'Espaço Vazio' propositalmente, isso é null.
  • Se você nem tem a estante, tentar procurar o jogo lá vai te dar um erro de referência.

Será que a gente realmente entende como o JavaScript pensa ou a gente só vai aceitando os erros conforme eles aparecem? Parar pra analisar esses detalhes faz toda a diferença na hora de debugar um sistema complexo.

Então, da próxima vez que você vir esse erro, não se desespere. Respira fundo, olha onde a variável deveria ter sido definida e usa as ferramentas modernas da linguagem pra tratar o caso. O JavaScript tem suas manias, mas depois que você entende o jeito dele de ser, a convivência fica bem mais tranquila.

Se você ficou curioso pra saber que outros materiais de programação e desenvolvimento web têm organizados lá, dá uma olhada no ChaveMestra — pode ser que você encontre exatamente o que tava procurando sem ter que garimpar pela internet.

Compartilhe: