HOWTO · JavaScript

Verifique se um valor é objeto em JavaScript

Neste tutorial iremos verificar se um valor é um objeto em JavaScript

Nesta página

Para verificar se um valor JavaScript é um objeto, use typeof value === "object" && value !== null. Esse predicado inclui arrays e outros objetos, mas exclui null e funções. Se o código também deve aceitar funções, acrescente typeof value === "function" à condição. Escolha a regra que corresponde às necessidades do seu programa: o JavaScript trata funções como objetos chamáveis, enquanto typeof as identifica separadamente.

Use instanceof para verificar se um valor é um objeto em JavaScript

instanceof é um operador que verifica se o protótipo de um construtor aparece na cadeia de protótipos de um valor. Para um objeto simples criado no mesmo ambiente JavaScript, value instanceof Object geralmente retorna true. Isso é útil quando você quer verificar se uma instância está associada a um construtor específico, como em value instanceof Date.

Esse operador não é um predicado universal para objetos. Um objeto criado com Object.create(null) não tem Object.prototype na cadeia e, por isso, não passa em instanceof Object. Objetos criados em outro ambiente, como outra janela do navegador ou um iframe, também têm construtores e protótipos diferentes; um objeto desse ambiente pode não passar na verificação instanceof Object do ambiente atual. Quando precisar de uma verificação geral de objetos que funcione nesses casos, use um predicado baseado em typeof.

Use typeof para verificar se um valor é um objeto em JavaScript

typeof é um operador, não uma função, e não precisa de parênteses em volta do valor. Para objetos comuns, incluindo arrays, typeof value retorna "object". Há dois resultados que você deve ter em mente: typeof null também retorna "object", enquanto typeof aplicado a uma função retorna "function". Portanto, comparar apenas com "object" inclui null e exclui funções. Se quiser identificar objetos sem incluir valores nulos, adicione uma verificação explícita para null.

Defina uma verificação reutilizável para objetos

Este predicado retorna true para objetos diferentes de null e false para funções, valores primitivos e null. O exemplo mostra o resultado para um objeto, um valor nulo, um número e uma função.

function isObject(value) {
  return value !== null && typeof value === "object";
}

const person = { name: "Ada" };
console.log(isObject(person));
console.log(isObject(null));
console.log(isObject(42));
console.log(isObject(() => {}));

Cada chamada imprime um resultado booleano, na mesma ordem dos valores de entrada. Esta definição responde intencionalmente à pergunta “isto é um objeto diferente de null?”. Se uma função também deve ser considerada válida no seu caso, use value !== null && (typeof value === "object" || typeof value === "function"). Evite verificar value.constructor.toString() para esse fim: um valor pode não ter o construtor esperado, e nomes de construtores ou seu texto-fonte não são uma forma geral confiável de determinar o tipo. O padrão Object(value) === value também tem comportamento de conversão que pode obscurecer o objetivo do predicado.

Use Object.getPrototypeOf() para inspecionar o protótipo de um objeto

Object.getPrototypeOf(value) responde a outra pergunta: retorna o protótipo de um objeto. Por exemplo, Object.getPrototypeOf(Object.create(null)) retorna null, enquanto Object.getPrototypeOf({}) retorna Object.prototype. Isso pode ajudar a inspecionar a herança ou comparar o protótipo de um valor com um protótipo conhecido, mas não substitui um predicado para verificar objetos. Passar null ou undefined para Object.getPrototypeOf() causa um TypeError; outros valores primitivos são convertidos em objetos antes que seus protótipos sejam retornados. Use esse método somente quando precisar inspecionar um protótipo, e não como uma verificação geral de objetos.