---
title: 'Qual é a diferença entre uma variável que é: `null`, `undefined` ou não declarada?'
subtitle: Como você checaria cada um destes estados?"
---

Variáveis **não declaradas** são criadas quando você atribui um valor a um identificador que não foi criado anteriormente usando var, let ou const. Variáveis não declaradas serão definidas globalmente, fora do escopo atual. No modo estrito, um `ReferenceError` será lançado quando você tentar atribuir a uma variável não declarada. Variáveis não declaradas são ruins assim como as variáveis globais são ruins. Evite elas a todo custo! Para verificá-las, envolva o uso delas em um bloco `try/catch`.

```js
function foo() {
  x = 1; // Lança um erro de referência em modo strict
}

foo();
console.log(x); // 1
```

Uma variável que é `undefined` é uma variável que foi declarada, mas não atribuída um valor. É do tipo 'undefined'. Se uma função não retornar nenhum valor como resultado de sua execução, e se for atribuída a uma variável, a variável também terá o valor de `undefined`. Para verificar isso, compare usando o operador de igualdade estrita (`===`) ou `typeof`, que retornará a string `undefined`. Note que você não deve usar o operador de igualdade abstrata para verificar, pois também retornará `true` se o valor for `null`.

```js
var foo;
console.log(foo); // undefined
console.log(foo === undefined); // true
console.log(typeof foo === 'undefined'); // true

console.log(foo == null); // verdadeiro. Errado, não use isso para verificar!

function bar() {}
var baz = bar();
console.log(baz); // undefined
```

Uma variável que é `null` terá sido explicitamente atribuída ao valor `null`. Ele não representa nenhum valor e é diferente de `undefined` no sentido de que foi explicitamente atribuído. Para verificar se é `null,` simplesmente compare usando o operador de igualdade estrita. Observe que, assim como acima, você não deve usar o operador de igualdade abstrata (`==`) para verificar, pois também retornará `true` se o valor for `undefined`.

```js
var foo = null;
console.log(foo === null); // verdadeiro
console.log(typeof foo === 'object'); // verdadeiro

console.log(foo == undefined); // true. Errado, não use isto para verificar!
```

Como bom hábito, nunca deixe suas variáveis não declaradas ou não atribuídas. Atribua explicitamente `null` a elas depois de declará-las, se você não pretende usá-las ainda. Se você usa alguma ferramenta de análise estática em seu fluxo de trabalho (por exemplo, ESLint, TypeScript Compiler), geralmente ela também pode verificar se você está referenciando variáveis não declaradas.
