JavaScript typeof: Como Verificar Tipos de Dados
O JavaScript typeof é um operador fundamental para identificar o tipo de um valor durante a execução de um programa. Ele é especialmente útil em validações, depuração, tratamento de dados vindos de APIs e criação de funções reutilizáveis. Embora pareça simples, o operador typeof possui comportamentos históricos que podem surpreender, como o resultado "object" para null e para arrays. Compreender essas particularidades permite escrever código JavaScript mais previsível, seguro e fácil de manter, reduzindo erros causados por entradas inesperadas.
Entenda o operador JavaScript typeof
O operador typeof retorna uma string que representa o tipo do operando informado. Sua sintaxe pode ser usada com ou sem parênteses: typeof valor ou typeof(valor). Na prática, ambas as formas funcionam da mesma maneira, mas a versão sem parênteses é frequentemente usada em condições simples, enquanto a outra pode melhorar a leitura em expressões mais longas.
Por exemplo, ao declarar const idade = 30;, a expressão typeof idade retorna "number". Já em const nome = "Ana";, o resultado é "string". Esse retorno padronizado torna o operador adequado para comparações explícitas, como if (typeof nome === "string"). É importante comparar o resultado com strings em letras minúsculas, pois esses são os valores definidos pela linguagem.
Segundo a documentação da MDN Web Docs sobre typeof, o operador pode ser aplicado a valores primitivos, objetos, funções e identificadores não declarados. Esse último caso é uma diferença relevante: typeof variavelInexistente retorna "undefined", sem lançar um ReferenceError. Assim, ele pode auxiliar em verificações de compatibilidade e em códigos que dependem de recursos opcionais do ambiente.
Apesar de útil, typeof não é uma solução universal para toda validação de tipo. Ele diferencia bem números, textos, booleanos, símbolos, bigints, funções e valores indefinidos. Entretanto, objetos comuns, datas, expressões regulares e arrays recebem, em geral, o retorno "object". Por isso, a escolha da técnica de validação deve considerar a estrutura exata que o programa espera receber.
Exemplos práticos de uso
Em uma função que calcula desconto, verificar se o preço é numérico evita operações incorretas. Um exemplo é: if (typeof preco !== "number" || Number.isNaN(preco)) { throw new TypeError("Preço inválido"); }. Observe que typeof NaN também resulta em "number"; portanto, a verificação com Number.isNaN() complementa o operador.
Outro cenário comum envolve parâmetros opcionais. Uma função pode aceitar um callback apenas quando ele for uma função: if (typeof aoConcluir === "function") { aoConcluir(); }. Essa abordagem impede a tentativa de executar strings, objetos ou valores nulos como se fossem funções. Em aplicações maiores, esse cuidado melhora a robustez das interfaces entre módulos.
Para valores que chegam de formulários, APIs ou armazenamento local, o typeof também ajuda a decidir se uma conversão é necessária. Dados de campos HTML, por exemplo, normalmente chegam como texto. Antes de calcular, é recomendável converter e validar: const quantidade = Number(valorDoCampo);, seguido por testes de número finito. Não basta confiar no tipo original quando a fonte dos dados não é controlada.
Resultados mais importantes do typeof
Conhecer os retornos possíveis do operador acelera a leitura de código e evita comparações equivocadas. A lista abaixo apresenta os casos mais frequentes e a maneira correta de interpretá-los:
- string: identifica textos, incluindo strings vazias como
"". - number: representa inteiros, decimais,
Infinitye tambémNaN; useNumber.isNaN()quando necessário. - boolean: é retornado para os valores literais
trueefalse. - undefined: indica uma variável declarada sem valor, uma propriedade inexistente ou um identificador não declarado consultado com
typeof. - bigint: identifica inteiros de precisão arbitrária, como
9007199254740993n. - symbol: corresponde aos valores únicos criados por
Symbol(). - function: é retornado para funções regulares, funções de seta, classes e construtores invocáveis.
- object: abrange objetos, arrays, datas, expressões regulares e, de forma histórica, o valor
null.
O caso de null merece atenção especial. Apesar de ser um valor primitivo na especificação moderna, typeof null retorna "object" por uma decisão histórica mantida para preservar a compatibilidade com códigos antigos. Para testar se um valor é nulo, utilize a comparação direta valor === null. Não tente inferir essa condição apenas pelo resultado de typeof.
Comparativo entre typeof e outras validações
O operador typeof é rápido e direto, mas outras ferramentas oferecem maior precisão para estruturas específicas. A tabela mostra quando cada alternativa é mais adequada:
| Técnica | Melhor uso | Exemplo | Limitação principal |
|---|---|---|---|
typeof | Primitivos, funções e valores indefinidos | typeof valor === "string" | Arrays e null aparecem como object |
Array.isArray() | Identificação confiável de arrays | Array.isArray(itens) | Não valida o conteúdo do array |
instanceof | Objetos criados por construtores específicos | data instanceof Date | Pode falhar entre diferentes contextos globais |
Number.isNaN() | Detecção exata de NaN | Number.isNaN(numero) | Não substitui a checagem de outros números inválidos |
Object.prototype.toString.call() | Inspeção detalhada de objetos internos | Object.prototype.toString.call(valor) | Sintaxe mais extensa e menos legível |
Para arrays, prefira sempre Array.isArray(). A expressão typeof [] retorna "object", o que não permite distinguir uma lista de um objeto simples. Para datas, valor instanceof Date pode ser útil, mas a validade ainda deve ser confirmada com !Number.isNaN(valor.getTime()). Uma instância de Date pode existir e, ainda assim, conter uma data inválida.
Em aplicações que atravessam iframes, janelas ou diferentes contextos de execução, instanceof pode produzir resultados inesperados, porque os construtores podem pertencer a ambientes globais distintos. Nesses casos, métodos como Array.isArray() e verificações estruturais costumam ser mais confiáveis. A especificação oficial do comportamento do operador está disponível no padrão ECMAScript mantido pelo TC39.

Dúvidas comuns sobre verificação de tipo
O que o JavaScript typeof retorna?
O typeof retorna uma string com o tipo do valor analisado. Os resultados mais comuns são "string", "number", "boolean", "undefined", "bigint", "symbol", "function" e "object". O resultado deve ser comparado exatamente com essas strings.
Por que typeof null retorna object?
Esse retorno é um comportamento histórico do JavaScript. Nas primeiras implementações, valores foram codificados internamente de uma forma que fez null ser classificado como objeto. O erro foi preservado por compatibilidade. Para identificar null corretamente, use valor === null.
Como verificar se uma variável é um array em JavaScript?
Use Array.isArray(variavel). Embora arrays sejam objetos, typeof variavel retorna apenas "object", sem informar se o valor é uma lista. Array.isArray() é a API padrão, clara e confiável para essa finalidade.
typeof consegue identificar NaN?
Não de forma suficiente. Como NaN pertence ao tipo numérico, typeof NaN retorna "number". Para verificar esse valor especificamente, utilize Number.isNaN(valor). Essa função evita coerções indesejadas presentes em abordagens mais antigas.
É seguro usar typeof em uma variável não declarada?
Sim, desde que o identificador seja usado diretamente com o operador. Por exemplo, typeof bibliotecaOpcional retorna "undefined" quando a variável não foi declarada. Porém, acessar uma propriedade, como bibliotecaOpcional.config, ainda causará erro se ela não existir.
Boas práticas para código mais confiável
O uso eficiente de JavaScript typeof depende de combinar simplicidade e precisão. Utilize-o para validar primitivos e funções, mas complemente a lógica quando o programa exigir arrays, datas, números válidos ou objetos com propriedades específicas. Além de confirmar o tipo, valide o formato e as regras de negócio. Um objeto pode ser tecnicamente um objeto, mas não conter os campos obrigatórios para a operação.
Também é recomendável evitar coerções implícitas. Em vez de aceitar qualquer entrada e esperar que o JavaScript converta valores automaticamente, valide primeiro e converta de maneira explícita. Essa prática torna erros mais fáceis de diagnosticar, reduz comportamentos ambíguos e fortalece a segurança de rotinas que recebem dados externos.
Referências consultadas
- MDN Web Docs — operador typeof.
- ECMAScript Language Specification — TC39.
- MDN Web Docs — Array.isArray().
- MDN Web Docs — Number.isNaN().
Isenção de responsabilidade
Este conteúdo tem finalidade educacional e informativa. Exemplos de código podem exigir adaptações conforme a versão do JavaScript, o ambiente de execução, o framework utilizado e os requisitos de cada projeto. Antes de aplicar validações em sistemas de produção, realize testes, revise as regras de negócio e consulte a documentação oficial das APIs envolvidas.
Compartilhar este post
Pesquisador, empresário e escritor focado em educação, orientação sobre negócios. Escreve sobre diversos assuntos com abordagem prática e acessível para o público brasileiro.