Como verificar se o objeto é vazio em Javascript?

Como verificar se o objeto é vazio em Javascript?
Publicado em:

Em Javascript, sabemos que é possível saber se um Array é vazio simplesmente utilizando a propriedade length. Se ela for 0, significa que o Array está vazio.

Exemplo:

var arr1 = [1, 2, 3];
var arr2 = [];

console.log(arr1.length === 0); // false
console.log(arr2.length === 0); // true

Porém Object não possui length. Ou seja, não há maneira de saber o tamanho de um Object, da maneira que fazemos com o Array. Sendo assim, como podemos saber se o mesmo é vazio ou não?

Verificando se o objeto é vazio

Para fazer isso em Javascript, existem diversas maneiras. Vejamos algumas delas, nas versões mais recentes e nas mais antigas.

Nas versões de navegadores mais recentes

Em navegadores mais atuais, podemos utilizar alguns método presentes em Object. Entre eles, podemos destacar os seguintes:

Utilizando Object.values

O método Object.values retorna todos os valores de um objeto em um Array.

console.log(Object.values({"nome": "Wallace", "nick": "Maxters"})); 
// ['Wallace', 'Maxters']

Sendo assim, é possível utilizar a mesma abordagem do Array para checar se o mesmo é vazio.

Exemplo:

var vazio = {};
var nao_vazio = {"nome": "Wallace"};
if (Object.values(vazio).length === 0) {
  console.log('objeto está vazio');
}

if (Object.values(nao_vazio).length > 0) {
  console.log('objeto não está vazio');
}

Utilizando Object.keys

Da mesma forma acima, o Object.keys retorna um Array de chaves de um objeto.

Exemplo:

console.log(Object.keys({"nome": "Wallace", "nick": "Maxters"})); 
// ['nome', 'nick']

Sendo assim, basta usar a mesma abordagem de Object.values:

var vazio = {};
var nao_vazio = {"nome": "Wallace"};
console.log(Object.keys(vazio).length === 0); // true
console.log(Object.keys(nao_vazio).length === 0); // false

Utilizando Object.entries

O método Object.entries retorna um Array contendo a chave e o valor do objeto em um Array.

Por exemplo:

var user = {
  "nome": "Wallace",
  "nick": "Maxters"
};
Object.entries(user); // [['nome', 'Wallace'], ['nick', 'Maxters']]

Sendo assim, também podemos usar length.

var nao_vazio = {"valor": 5};
var vazio = {};
if (Object.entries(vazio) === 0) {
  console.log('vazio');
}

if (Object.entries(nao_vazio) > 0) {
  console.log('não vazio');
}

Versões mais antigas

Nas versões mais antigas dos navegadores, confesso que o código talvez não possa parecer tão elegante.

Utilizando JSON.stringify

O método JSON.sringify converte um valor em Javascript para JSON. Sendo assim, um objeto vazio sempre seria equivalente a string "{}".

Então, bastaria comparar:

if (JSON.stringify(vazio) === '{}') {
  console.log('Objeto está vazio');
}

if (JSON.stringify(nao_vazio) !== '{}') {
   console.log('Objeto não está vazio');
}

Utilizando um Loop

Em Javascript, o Object pode ser iterado com o laço de repetição for. Basicamente, podemos criar uma função que faça um loop no Object, retornando false caso entre no for e true caso não entre.

Basta fazer assim:

function isEmptyObject(object) {
    for (var name in object) return false;
    return true;
}

if (isEmptyObject({})) {
    console.log('Object vazio');
}

if (! isEmptyObject({nome: "wallace"}) {
    console.log('Objeto não está vazio');
}