Como faço para testar um objeto JavaScript vazio?

3110

Após uma solicitação AJAX, às vezes meu aplicativo pode retornar um objeto vazio, como:

var a = {};

Como posso verificar se é esse o caso?

falmp
fonte
7
Você usa o script JSON.js? Ou qualquer outra biblioteca JSON. Em seguida, você pode usar a função JSON.encode () para converter var em string e testá-la.
Thevs 25/03/09
if( Object.entries(a).length > 0){ //do }
Muhammad Shahzad

Respostas:

5426

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

Observe, no entanto, que isso cria uma matriz desnecessária (o valor de retorno de keys).

Pré-ECMA 5:

function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      return false;
    }
  }

  return JSON.stringify(obj) === JSON.stringify({});
}

jQuery :

jQuery.isEmptyObject({}); // true

lodash :

_.isEmpty({}); // true

Sublinhado :

_.isEmpty({}); // true

Hoek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (versão 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true
Adam Zerner
fonte
22
Aqui é o teste de desempenho entre jQuery e sublinhado jsperf.com/isempty-vs-isemptyobject/6
Mikhail
20
Object.keys(new Date()).length === 0; então essa resposta pode ser enganosa.
Cjbarth #
6
Em vez de restringir as coisas, você também pode tirar proveito desse fato: (new Date()).constructor === Dateou vice-versa ({}).constructor === Object.
John
2
angular.equals ({}, {});
Jeremy A. West
11
Object.keys()não verifica propriedades não enumeráveis ​​ou símbolos. Você precisa usar Object.getOwnPropertyNames()e em Object.getOwnPropertySymbols()vez disso. Além disso, Object.getPrototypeOf()é a maneira correta de obter o protótipo de um objeto. obj.constructorpode ser facilmente forjado. Exemplo: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Jesse
863

Não há maneira fácil de fazer isso. Você terá que fazer um loop sobre as propriedades explicitamente:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

Se o suporte ao ECMAScript 5 estiver disponível, você poderá usar Object.keys():

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}
Christoph
fonte
56
Isso funciona bem, ou mais simplesmente: function isEmpty (objeto) {for (vari no objeto) {return true; } retorna falso; }
Nicholas Kreidberg 24/03/10
36
Verdadeiro e falso não deveriam ser revertidos nessa função?
Namtax 5/05
25
@namtax: no - a função é nomeada isEmpty() , então ele deve retornar falsese ele tem uma propriedade
Christoph
6
objeto vazio estenderá a classe Object padrão, mas se o protótipo do objeto for modificado, sua função simplificada falhará considere: Object.prototype.a = 'hi'; var obj = {}; alerta (obj.a); // gera "oi" isEmpty (obj) // retorna false
venimus
29
Você não deve usar o segundo exemplo, pois é complexidade do tempo O (n) e complexidade do espaço O (n), enquanto o primeiro é O (1).
Brian
572

Para aqueles que têm o mesmo problema, mas usam o jQuery, você pode usar o jQuery.isEmptyObject .

Erik Töyrä Silfverswärd
fonte
43
EI! Passei algumas horas depurando os problemas do IE 8 apenas para descobrir que era o jQuery.isEmptyObject que estava causando o problema. Retorna true se o objeto estiver vazio.
MFD3000 17/08/11
162
Por que você publica respostas, incluindo jQuery, se a pergunta não é sobre jQuery?
Eru
47
Eu sei que é um comentário antigo, mas pergunto-me a pergunta @ MFD3000, porque o docu diz: retorna verdadeiro, se o objeto estiver vazio (como o nome indica)
Александр Фишер
21
Incluir o jQuery para uma tarefa tão básica não é o que eu chamaria de resposta certa. É verdade que hoje em dia o jQuery é quase onipresente, mas ainda não devemos esquecer que ele é construído em torno de uma linguagem muito capaz.
Pablo Mescher 27/02/2013
54
JS snobbery típico nestes comentários. Todo mundo sabe que uma grande proporção de JavaScript na Web é escrita no jQuery, portanto, é perfeitamente aceitável fornecer uma solução aqui para o jQuery se ele já possui um método interno para testar objetos. É provável que milhares de desenvolvedores que procuram ajuda achem esta resposta útil. Ninguém disse que é a única maneira de fazê-lo. Eu observo como ninguém age tudo elitista sobre o cara que postou uma solução para uso underscore.js...
BadHorsie
276

Esta é a minha solução preferida:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
dhruvio
fonte
1
Problema de compatibilidade com o IE9 BTW. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
doublejosh
3
@Jero Franzani: não, não
nikoskip
O comprimento de Object.keys ({}). É 10 vezes mais lento que a opção (for ... in ...) - sugiro evitá-lo como uma maneira de testar se um objeto está vazio.
Davidhadas
10
Object.keys(new Date()).length === 0; então essa resposta pode ser enganosa.
cjbarth
new Date()não é um objeto. nd = new Date(); nd.constructor === Object;resulta em false.
pors
204

Você pode usar o Underscore.js .

_.isEmpty({}); // true
Baggz
fonte
19
Ou você pode usar o lodash está vazio ( lodash.com/docs#isEmpty ), mas como isso difere do uso de uma solução jQuery - você ainda precisa instalar uma biblioteca adicional. Eu acho que uma solução javascript de baunilha é a intenção.
tfmontague
10
É diferente se você deseja usar JS no back-end com Node.js. Poucas pessoas desejam usar o jQuery (uma biblioteca de front-end usada principalmente para manipulações DOM) no back-end.
Nahn 22/09/14
3
O sublinhado @tfmontague é muito comum nos aplicativos de nó, quase tão onipresente quanto o jQ no lado do cliente. Eu já tinha sublinhado necessário, mas não sabia que tinha essa função
rw-nandemo
5
Sublinhado está sendo substituído por lodash. Use isso em vez disso.
demisx
2
Basta ter cuidado com os tipos de data, isEmpty sempre retornar true para Data, ver github.com/jashkenas/underscore/issues/445
mentat
116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

consulte http://bencollier.net/2011/04/javascript-is-an-object-empty/

es colônia
fonte
5
Isso inclui propriedades não enumeráveis, caso você se importe.
O Object.getOwnPropertyNames ({}). Length é 10 vezes mais lento que a opção (for ... in ...) - sugiro evitá-lo como uma maneira de testar se um objeto está vazio.
Davidhadas
4
Object.getOwnPropertyNames(new Date()).length === 0; então essa resposta pode ser enganosa.
precisa saber é
80

Que tal usar JSON.stringify? Está quase disponível em todos os navegadores modernos.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}
Ateszki
fonte
23
return (JSON.stringify (obj) == '{}')
Vic
26
Isso é lento e a velocidade é importante para esse tipo de utilitário. Teste rápido de desempenho aqui: jsperf.com/empty-object-test
1
Esta é uma opção muito lenta - sugiro usar a opção (for ... in) em vez de
davidhadas
2
E isso não funciona para objetos que contêm funções.
Felix Kling
1
Também emitirá um erro se houver uma referência circular no objeto. Portanto, é lento, não confiável e pode gerar erros e interromper todo o resto. Não há razão para usá-lo sempre.
Burak
62

Acabei de encontrar uma situação semelhante. Eu não queria usar JQuery e queria fazer isso usando Javascript puro.

E o que fiz foi usar a seguinte condição e funcionou para mim.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

Para não igual a, use o seguinte: JSON.stringify(obj) !== '{}'

Confira este JSFiddle

Anish Nair
fonte
4
Falha em objetos com referências circulares, já que o JSON.stringify lança especificamente uma exceção para eles.
Pedro Montoto García
1
@ PedroMontotoGarcía Ok e como um objeto vazio terá uma referência circular?
KthProg
8
Se o objeto não estiver vazio (e deve funcionar para eles também).
Pedro Montoto García 29/01
Parece que isso já foi mencionado por @Ateszki e é uma das maneiras mais lentas de verificar se um objeto não está vazio.
precisa
Ah sim ... eu senti falta disso. Eu me deparei com uma situação em que queria obter esse javascript e, depois de pensar um pouco, descobri dessa maneira. @ Ateszki, até eu pensei do jeito que você fez. :-) Btw, havia muitas respostas sobre isso, então eu perdi sua resposta.
Anish Nair
60

Pergunta antiga, mas só tinha o problema. Incluir JQuery não é realmente uma boa idéia se seu único objetivo é verificar se o objeto não está vazio. Em vez disso, entre no código do JQuery e você obterá a resposta:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}
Jonathan Petitcolas
fonte
5
Isso é útil apenas se algum outro processo não tiver adicionado um protótipo ao seu objeto base. Para tornar isso realmente viável, você precisa testar obj.hasOwnProperty (name)
mpemburn
1
Isso não acrescenta nada para a resposta de Christoph a partir de 2009.
Dan Dascalescu
39

Existe uma maneira simples se você estiver em um navegador mais recente. Object.keys(obj).length == 0

baixar
fonte
1
De onde vem a keyspropriedade?
2
É um método padrão no ECMAScript 5.1
download de
1
Como o comentário acima pode ter 4 votos positivos? Sim, Object.keysé um método padrão, mas os objetos não possuem uma propriedade de chaves. Portanto, esse código reportará qualquer objeto como vazio, exceto que acidentalmente possui uma propriedade nomeada keycom um valor que novamente como uma propriedade nomeada lengthque não é zero. Horrível!
Scravy
Object.keys(new Date()).length === 0; então essa resposta pode ser enganosa.
cjbarth
11
@scravy Object é a classe Object. O objeto possui um método estático chamado 'keys', que aceita um objeto como argumento. Este método retorna uma matriz de cadeias onde as cadeias são nomes de propriedades. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Sgnl
34

atuação

Hoje 2020.01.17 realizo testes no MacOs HighSierra 10.13.6 no Chrome v79.0, Safari v13.0.4 e Firefox v72.0, para soluções escolhidas.

Conclusões

  • soluções baseadas em for-in(A, J, L, M) são mais rápidas
  • soluções baseadas em JSON.stringify(B, K) são lentas
  • surpreendentemente também a solução baseada em Object(N) é lenta

insira a descrição da imagem aqui

Detalhes

Abaixo no snippet são apresentadas 15 soluções. Se você deseja executar o teste de desempenho em sua máquina, clique AQUI .

insira a descrição da imagem aqui

Kamil Kiełczewski
fonte
muito disso não faz sentido, porque você está baseando tudo em um retorno de falso e ou verdadeiro. Às vezes, a programação precisa de uma instrução if ou de um operador ternário. just fyi
Christian Matthew
1
É a melhor resposta, obrigado. A primeira solução funciona como um encanto.
Carlos Jesus Arancibia Taborga
33

O uso de Object.keys (obj) .length (como sugerido acima para ECMA 5+) é 10 vezes mais lento para objetos vazios! continue com a opção old school (for ... in).

Testado no Node, Chrome, Firefox e IE 9, fica evidente que, na maioria dos casos de uso:

  • (para ... em ...) é a opção mais rápida de usar!
  • Object.keys (obj) .length é 10 vezes mais lento para objetos vazios
  • JSON.stringify (obj) .length é sempre o mais lento (não surpreendente)
  • Object.getOwnPropertyNames (obj) .length demora mais que Object.keys (obj) .length pode demorar muito mais em alguns sistemas.

Em termos de desempenho, use:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

ou

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

Veja resultados detalhados e código de teste em O objeto está vazio?

davidhadas
fonte
Object.keysé lento, mas menos código. Em uma página pequena, onde isso é chamado ... talvez 10 vezes ... Isso ainda será mais lento, considerando o tempo de análise adicional do código adicional?
yankee
32

Você pode verificar a contagem das chaves do objeto:

if (Object.keys(a).length > 0) {
    // not empty
}
Ashutosh Ranjan
fonte
8
Por que você adicionaria um comentário para uma resposta que já foi dada e forneceria uma resposta pior? stackoverflow.com/a/32108184/4229159 e é o 1º resposta de abril
Alejandro Vales
Como se eu tivesse um objeto muito grande e fizesse isso em cada loop apenas para ver se o objeto estava vazio?
StefansArya
27
  1. Apenas uma solução alternativa. Seu servidor pode gerar alguma propriedade especial no caso de não haver dados?

    Por exemplo:

    var a = {empty:true};

    Em seguida, você pode verificá-lo facilmente no seu código de retorno de chamada AJAX.

  2. Outra maneira de verificar isso:

    if (a.toSource() === "({})")  // then 'a' is empty

EDIT : Se você usar qualquer biblioteca JSON (fe JSON.js), poderá tentar a função JSON.encode () e testar o resultado em relação à cadeia de valor vazia.

Thevs
fonte
6
toSource()é não-padrão e não funciona no IE ou Opera (e potencialmente outros navegadores eu não verificar)
Christoph
4
@Thevs: talvez você tenha uma cópia diferente da versão atual do ECMA-262, mas a minha não lista uma toSourcepropriedade na seção 15.2.4; de acordo com o MDC, foi introduzido no JS1.3 (ou seja, Netscape Navigator 4.06), mas NÃO está no ECMA-262, 3ª edição!
Christoph
4
@Thevs: bem, pelo menos dois fornecedores importantes de navegadores não o implementaram, por isso não é um padrão de fato, e como não está no ECMA-262, também não é real ...
Christoph
4
Mesmo quando funciona, toSource()é uma maneira horrível de fazer isso (como está JSON.encode()). Ele precisa criar uma string que represente todo o objeto para verificar se está vazio. Existe a sobrecarga de converter coisas em seqüências de caracteres, mas além disso, será necessário converter um milhão de coisas se o seu objeto tiver um milhão de propriedades, enquanto apenas a observação de uma delas permitirá que você saiba que ela não está vazia.
Jasper
4
@ Parece que a sobrecarga é maior, mesmo que possa ser (não tenho certeza de que esteja em todas as circunstâncias) na mesma ordem de magnitude. No entanto, essa resposta envolve retornar false, logo que uma propriedade diferente é encontrado o que torna a história é diferente todos juntos ...
Jasper
25

Eu criei uma função completa para determinar se o objeto está vazio.

Ele usa Object.keysda funcionalidade ECMAScript 5 (ES5), se possível, para obter o melhor desempenho (consulte a tabela de compatibilidade ) e fallbacks para a abordagem mais compatível para mecanismos mais antigos (navegadores).

Solução

/**
 * Returns true if specified object has no properties,
 * false otherwise.
 *
 * @param {object} object
 * @returns {boolean}
 */
function isObjectEmpty(object)
{
    if ('object' !== typeof object) {
        throw new Error('Object must be specified.');
    }

    if (null === object) {
        return true;
    }

    if ('undefined' !== Object.keys) {
        // Using ECMAScript 5 feature.
        return (0 === Object.keys(object).length);
    } else {
        // Using legacy compatibility mode.
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                return false;
            }
        }
        return true;
    }
}

Aqui está a essência deste código.

E aqui está o JSFiddle com demonstração e um teste simples.

Espero que ajude alguém. Felicidades!

Slava Fomin II
fonte
3
Isso falha para um nullobjeto.
Olá @torazaburo! Obrigado por prestar atenção! Atualizei todas as fontes com a implementação correta.
Slava Fomin II
1
O comprimento de Object.keys ({}). É 10 vezes mais lento que a opção (for ... in ...) - sugiro evitá-lo como uma maneira de testar se um objeto está vazio.
Davidhadas
1
Object.keys(new Date()).length === 0; então essa resposta pode ser enganosa.
Cjbarth #
19

Eu estou usando isso.

function isObjectEmpty(object) {
  var isEmpty = true;
  for (keys in object) {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

Por exemplo:

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

daqui

Atualizar

OU

você pode usar a implementação jQuery de isEmptyObject

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}
kiranvj
fonte
Oi. quando você testa essa função com número ou retorno booleano verdadeiro ou falso verdadeiro e isso não é o resultado correto. isObjectEmpty (true). isObjectEmpty (false). isObjectEmpty (1)
iman
2
Estamos verificando se o objeto está vazio, não se o tipo de dados é um objeto. No seu caso para verificar se o seu objecto é preciso algo como if (typeof uma === "objeto") {...}
kiranvj
15

O exemplo a seguir mostra como testar se um objeto JavaScript está vazio, se por vazio significa que não temos propriedades próprias.

O script funciona no ES6.

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty(''));           // true
console.log(isEmpty(33));           // true
console.log(isEmpty([]));           // true
console.log(isEmpty({}));           // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello'));      // true
console.log(isEmpty([1, 2, 3]));    // true
console.log(isEmpty({ test: 1 }));  // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date()));   // true
console.log(isEmpty(Infinity));     // true
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true

GibboK
fonte
15

De acordo com a ES2017 especificação sobre Object.entries () , a verificação é simples de usar qualquer browser-- moderna

Object.entries({}).length === 0
Vikrant
fonte
3
Existe algum benefício em usar isso sobre Object.keysou Object.values?
Faintsignal
@faintsignal usando esses está perfeitamente bem. Acabei de adicionar entradas porque não as encontrei nos comentários.
Vikrant
13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}
Raças de leveza em órbita
fonte
4
Isso também será verdadeiro quando, por exemplo, uma biblioteca JavaScript se estender Objectcom um método através da cadeia de protótipos, porque isso é enumerável e a for ininstrução faz um loop através de propriedades enumeráveis.
Viam0Zah
12

O jQuery possui uma função especial isEmptyObject()para este caso:

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

Leia mais em http://api.jquery.com/jQuery.isEmptyObject/


fonte
12

Gostaria de verificar se tem pelo menos uma chave. Seria o suficiente para me dizer que não está vazio.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
Tudor Morar
fonte
1
e se a primeira chave retornar falsevalor? o resultado será falseincorreto.
Jimmy Obonyo Abor
Eu testei para isso. Você pode dar um exemplo de trabalho?
Tudor Morar
1
este é curto e conciso, mas irá resultar em erro de execução se o objeto é indefinido
Mrinmoy
11

Sob o capô, todos os métodos de verificação vazia em todas as bibliotecas usam a lógica de verificação de chaves de objetos. É uma maneira estranha de torná-lo compreensível, que você pode colocar em um método, descrito aqui .

for(key in obj){
   //your work here.
 break;
}

Que evoluiu no ES5 , agora você pode simplesmente verificar o comprimento das chaves do objeto, usando o Object.Keysmétodo que leva seu objeto como parâmetro:

if(Object.keys(obj).length > 0){
 //do your work here
}

Ou se você estiver usando o Lodash (você deve estar) então.

 _.isEmpty(obj) //==true or false
ahmadalibaloch
fonte
Enquanto está correto, é uma maneira estranha de fazer uma declaração if - provavelmente confundirá alguém que manterá o código depois de você.
Soren
10


você pode usar esse código simples que não usou jQuery ou outras bibliotecas

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

A classe JSON e suas funções ( análise e stringify ) são muito úteis, mas tem alguns problemas com o IE7 que podem ser corrigidos com este código simples http://www.json.org/js.html .

Outra maneira simples (maneira mais simples):
você pode usar dessa maneira sem usar o objeto jQuery ou JSON .

var a=({});

function isEmptyObject(obj) {
    if(typeof obj!='object') {
        //it is not object, so is not empty
        return false;
    } else {
        var x,i=0;
        for(x in obj) {
            i++;
        }
        if(i>0) {
            //this object has some properties or methods
            return false;
        } else {
            //this object has not any property or method
            return true;
        }
    }
}

alert(isEmptyObject(a));    //true is alerted
iman
fonte
JSON.stringifyA solução falhará se o objeto contiver propriedades não stringificáveis, como funções ou "indefinido", embora seja um caso extremo.
10

Melhor maneira que eu encontrei:

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

Trabalha para:

    t1: {} -> true
    t2: {0:1} -: false
    t3: [] -> true
    t4: [2] -> false
    t5: null -> true
    t6: undefined -> true
    t7: "" -> true
    t8: "a" -> false
    t9: 0 -> true
    t10: 1 -> false
DiegoAraujo
fonte
3
Eu diria que 0 não está vazio, pois na verdade é um número. tudo o resto parece bom, mas a correção é fácil. na primeira instrução if adicione isso. if (!obj && obj !== 0).
Mjwrazor #
9

Minha vez:

function isEmpty(obj) {
    return !Object.keys(obj).length > 0;
}

var a = {a:1, b:2}
var b = {}

console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true

Acho que nem todos os navegadores implementam Object.keys()atualmente.

NiKo
fonte
2
Object.keys(new Date()).length === 0; então essa resposta pode ser enganosa.
cjbarth
3
Depende se você considera uma data sempre "cheia", apesar de nunca expor as chaves. Mas concordo que, se esse for o seu plano, adicionar uma instância suplementar de verificação para o construtor Date é uma boa opção.
NiKo 20/03/16
9

Se o jQuery e o navegador da web não estiverem disponíveis, também haverá uma função isEmpty no underscore.js.

_.isEmpty({}) // returns true

Além disso, ele não assume que o parâmetro de entrada seja um objeto. Para uma lista ou sequência ou indefinida, ela também girará a resposta correta.

jichi
fonte
O sublinhado foi mencionado em uma resposta alguns anos antes .
Dan Dascalescu
7

Embargo! Cuidado com as limitações do JSON.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

exibe

    Cuidado !! obj NÃO está vazio!

    obj = {f: function () {}}

    JSON.stringify (obj)

    retorna

    {}
Ekim
fonte
7

A resposta correta é:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

Isso verifica se:

  • O objeto não possui propriedades próprias (independentemente da enumerabilidade).
  • O objeto não possui símbolos de propriedade próprios.
  • O protótipo do objeto é exatamente Object.prototype.

Em outras palavras, o objeto é indistinguível de um criado com {}.

Jesse
fonte
6

Além da resposta de Thevs:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

é jquery + jquery.json

starikovs
fonte
Não gosto de usar JSON porque ele não pode funcionar com estruturas de objetos circulares.
precisa saber é o seguinte
2
Se sua página carrega o jQuery, use-o $.isEmptyObject(), não perca ciclos com conversões não óbvias.
Skierpage
6

O Sugar.JS fornece objetos estendidos para esse fim. O código é limpo e simples:

Faça um objeto estendido:

a = Object.extended({})

Verifique o tamanho:

a.size()
mikemaccana
fonte