Quando uma variável é declarada sem ter um valor atribuído, seu valor inicial é undefined
.
Como você verifica se um valor é undefined
em JavaScript?
A resposta curta
Em navegadores modernos, você pode comparar a variável com segurança diretamente para undefined
:
Algumas pessoas argumentam contra a comparação com undefined
porque os navegadores antigos permitiam que seu valor fosse reatribuído desta forma:
Depois dessa reatribuição, comparando com undefined
diretamente não detectaria mais corretamente se uma variável recebeu um valor.
No entanto, esse comportamento foi corrigido em 2009 com ECMAScript 5:
Em navegadores modernos, ” não é mais possível reatribuir o valor undefined
global.
E se eu precisar de suporte para IE8 e anteriores?
Geralmente, comparando diretamente a un definido ainda é seguro. Não há razão prática para um aplicativo reatribuir o valor de undefined
.
Thomas Eding demonstra isso com uma analogia convincente:
Se você ainda estiver preocupado, há duas maneiras de verificar se um valor está indefinido, mesmo que o undefined
global tenha sido substituído.
Você pode usar o operador void para obter o valor de undefined
. Isso funcionará mesmo se o valor global window.undefined
tiver sido sobrescrito:
O zero neste exemplo não tem nenhum significado especial, você também pode usar 1
ou function(){}
. void(anything)
sempre será avaliado como undefined
.
Como alternativa, você pode usar o operador typeof para verificar com segurança se um valor foi atribuído. Em vez de comparar com o valor undefined
global, você verifica se o valor “s type é” undefined “:
Observe que isso é um pouco diferente das opções anteriores. Mesmo se name
não fosse “declarado typeof
, ainda diria que está indefinido. Se você comparou uma variável não declarada a undefined
ou void(0)
, você obteria um ReferenceError.
Mas não use void (0) diretamente
Evite usar void(0)
ou typeof x === "undefined"
literalmente no código. Essas expressões não são autoexplicativas e devem ser incluídas em uma função isUndefined como esta:
Muitas bibliotecas de utilitários já têm essa funcionalidade incorporada, por exemplo, há um _.isUndefined
em Underscore.js.