«O objeto está vazio — ou não?» Entendendo a eterna dor de cabeça do desenvolvedor JavaScript
\n\nImagine: você está escrevendo um aplicativo, recebe uma resposta de uma API e precisa saber — os dados chegaram? Ou o objeto está vazio e é hora de mostrar um placeholder ao usuário? Ou você está processando um formulário e precisa verificar se o usuário preencheu pelo menos um campo? Situação dolorosamente familiar para quem escreve em JavaScript.
\n\nParece simples, não? if (obj === {}) — e está resolvido? Infelizmente, não. Em JavaScript, dois objetos, mesmo com conteúdo idêntico, nunca serão iguais entre si, a menos que seja o mesmo objeto na memória. Verificar se um objeto JavaScript está vazio é aquela tarefa que acumulou milhares de visualizações no Stack Overflow e gerou toda uma indústria de soluções.
Neste artigo, vamos analisar 5 maneiras confiáveis de determinar se você tem um objeto vazio. Desde as clássicas até as modernas, das rápidas às seguras. Vamos lá!
\n\nO que significa «objeto vazio» em JavaScript?
\n\nAntes de mergulharmos no código, vamos alinhar os termos. Objeto vazio em JavaScript é um objeto que não possui propriedades próprias enumeráveis. Ou seja, {} é vazio. Já { name: "Alice" } não é.
Um detalhe importante: qualquer objeto tem um protótipo (Object.prototype), e portanto, possui propriedades herdadas (como toString, hasOwnProperty). Essas não nos interessam. Verificamos apenas o que adicionamos nós mesmos.
Outra armadilha é o null. Se a variável for null ou undefined, nem podemos chamar seus métodos. Portanto, primeiro sempre verificamos se o objeto existe.
Método 1: Object.keys() — o padrão ouro
\n\nA maneira mais popular e recomendada no JavaScript moderno. O método Object.keys() retorna um array das propriedades próprias enumeráveis do objeto. Se o array estiver vazio, o objeto está vazio.
function isEmpty(obj) {\n return Object.keys(obj).length === 0;\n}\n\n// Exemplos de uso\nconsole.log(isEmpty({})); // true\nconsole.log(isEmpty({a: 1})); // false\nconsole.log(isEmpty({name: 'John', age: 30})); // false\n\nPor que funciona? Object.keys() ignora propriedades herdadas e retorna apenas o que pertence ao próprio objeto. Verificar se um objeto está vazio com Object.keys() é um código limpo, legível e rápido.
Importante: Este método não verifica se o valor passado é um objeto. Se você passar uma string ou número, ele retornará um array vazio, e podemos erroneamente concluir que o objeto está vazio. Portanto, para segurança, adicione uma verificação de tipo:
\n\nfunction isEmptySafe(obj) {\n return obj && typeof obj === 'object' && Object.keys(obj).length === 0;\n}\n\nconsole.log(isEmptySafe('hello')); // false (string não é objeto)\nconsole.log(isEmptySafe(null)); // false\nconsole.log(isEmptySafe({})); // true\n\nMétodo 2: JSON.stringify() — inesperado, mas funcional
\n\nÀs vezes, programadores brincam chamando este método de «gambiarra», mas ele funciona. A ideia é simples: serializar o objeto em uma string JSON e compará-la com '{}'.
function isEmptyJSON(obj) {\n return JSON.stringify(obj) === '{}';\n}\n\nconsole.log(isEmptyJSON({})); // true\nconsole.log(isEmptyJSON({key: 'val'})); // false\n\nPor que este método não é ideal? Primeiro, JSON.stringify() ignora funções, undefined e símbolos. Se um objeto tiver uma propriedade com valor undefined, ela simplesmente desaparecerá na serialização, e o objeto será considerado vazio, mesmo tendo uma chave.
const obj = { a: undefined };\nconsole.log(isEmptyJSON(obj)); // true — mas deveria ser false!\n\nEm segun