¿Cómo pruebo un objeto JavaScript vacío?

Después de una solicitud AJAX, a veces mi aplicación puede devolver un objeto vacío, como:

var a = {};

¿Cómo puedo comprobar si ese es el caso?

preguntado el 24 de marzo de 09 a las 23:03

¿Utiliza el script JSON.js? O cualquier otra biblioteca JSON. Luego puede usar la función JSON.encode () para convertir var en cadena y luego probarlo. -

Solo busca if (Object.keys(obj).length === 0) { // handle empty obj } -

@GabrielPetersson Por favor, nunca proporcione soluciones como comentarios. Su comentario es una violación del diseño de página muy claro / simple de esta sección de preguntas y respuestas. El consejo de resolución se publicará como respuesta. Los comentarios bajo la pregunta deben solicitar al PO una aclaración u ofrecer ideas que no resuelvan. meta.stackexchange.com/a/296481/352329 -

30 Respuestas

ECMA 5+:

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

Sin embargo, tenga en cuenta que esto crea una matriz innecesaria (el valor de retorno de keys).

Antes de 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

Subrayar:

_.isEmpty({}); // true

Hoek

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

ExtJS

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

AngularJS (versión 1)

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

Ramda

R.isEmpty({}); // true

Respondido 06 Feb 21, 17:02

Aquí hay una prueba de rendimiento entre jQuery y guión bajo jsperf.com/isempty-vs-isemptyobject/6 - Mikhail

Object.keys(new Date()).length === 0; por lo que esta respuesta puede ser engañosa. - Cjbarth

En lugar de encadenar las cosas, también puedes aprovechar este hecho: (new Date()).constructor === Date, o al revés, ({}).constructor === Object. - John Nelson

angular.equals ({}, {}); - Jeremy A. Oeste

Object.keys() no comprueba propiedades o símbolos no enumerables. Necesitas usar Object.getOwnPropertyNames() y Object.getOwnPropertySymbols() en lugar de. También, Object.getPrototypeOf() es la forma correcta de obtener el prototipo de un objeto. obj.constructor se puede falsificar fácilmente. Ejemplo: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true. - Jesse

If Compatibilidad con ECMAScript 5 está disponible, puedes usar Object.keys():

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

Para ES3 y versiones anteriores, no hay una manera fácil de hacer esto. Tendrá que recorrer las propiedades explícitamente:

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

    return true;
}

Respondido 10 Feb 21, 13:02

Esto funciona bien, o más simplemente: function isEmpty (object) {for (var i in object) {return true; } falso retorno; } - Nicolás Kreidberg

¿No deberían invertirse verdadero y falso en esta función? - impuesto sobre el nombre

@namtax: no - la función se nombra isEmpty(), entonces debería regresar false si tiene una propiedad - Christoph

El objeto vacío extenderá la clase de Objeto predeterminada, pero si el prototipo del objeto se modifica, su función simplificada fallará. Considere: Object.prototype.a = 'hi'; var obj = {}; alerta (obj.a); // genera "hi" isEmpty (obj) // devuelve falso - veneno

No debe usar el segundo ejemplo ya que es O (n) complejidad temporal y O (n) complejidad espacial, mientras que el primero es O (1). - Brian

Para aquellos de ustedes que tienen el mismo problema pero usan jQuery, pueden usar jQuery.isEmptyObject.

contestado el 18 de mayo de 20 a las 23:05

¡OYE! Pasé unas horas depurando problemas de IE 8 y descubrí que era jQuery.isEmptyObject el que estaba causando el problema. Devuelve verdadero si el objeto está vacío. - MFD3000

¿Por qué publica una respuesta que incluye jQuery si la pregunta no es sobre jQuery en absoluto? - Son

Sé que es un comentario antiguo, pero me pregunto tu pregunta @ MFD3000, porque el documento dice: devuelve verdadero, si el objeto está vacío (como el nombre lo indica) - Александр Фишер

incluir jQuery para una tarea tan básica no es lo que yo llamaría la respuesta correcta. Es cierto que hoy en día jQuery es casi omnipresente, pero aún así no debemos olvidar que se basa en un lenguaje muy capaz en sí mismo. - Pablo Mescher

El esnobismo típico de JS en estos comentarios. Todo el mundo sabe que una gran proporción de JavaScript en la web está escrito en jQuery, por lo que es perfectamente aceptable proporcionar una solución aquí para jQuery si ya tiene un método incorporado para probar objetos. Es probable que miles de desarrolladores que buscan ayuda encuentren útil esta respuesta. Nadie dijo que es la única forma de hacerlo. Me doy cuenta de que nadie actúa todo elitista sobre el tipo que publicó una solución para usar underscore.js... - BadHorsie

Esta es mi solución preferida:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

Respondido 12 Jul 14, 08:07

@Jero Franzani: no, no lo hace - Nikoskip

La longitud de Object.keys ({}). Es 10 veces más lenta que la opción (for ... in ...) - sugiero evitarla como una forma de probar si un objetc está vacío. - Davidhadas

Object.keys(new Date()).length === 0; por lo que esta respuesta puede ser engañosa. - Cjbarth

new Date() no es un objeto. nd = new Date(); nd.constructor === Object; resultados en false. - poros

Puedes usar Underscore.js.

_.isEmpty({}); // true

Respondido el 21 de enero de 16 a las 15:01

O podrías usar lodash está vacío (lodash.com/docs#isEmpty), pero ¿en qué se diferencia de usar una solución jQuery? Aún necesita instalar una biblioteca adicional. Creo que la intención es una solución de JavaScript de vainilla. - montague

Es diferente si desea usar JS en el backend con Node.js. Pocas personas querrán usar jQuery (una biblioteca de front-end utilizada principalmente para manipulaciones DOM) en el backend. - nahn

El guión bajo @tfmontague es muy común en las aplicaciones de nodo, casi tan ubicuo como jQ en el lado del cliente. Ya tenía el subrayado requerido, pero no me di cuenta de que tenía esta función. rw-nandemo

El subrayado está siendo reemplazado por lodash. Úsalo en su lugar. - demisx

Solo tenga cuidado con los tipos de fecha, isEmpty siempre devuelve verdadero para la fecha, consulte github.com/jashkenas/subrayado/problemas/445 - mentat

Performance

Hoy 2020.01.17 realizo pruebas en MacOs HighSierra 10.13.6 en Chrome v79.0, Safari v13.0.4 y Firefox v72.0, para las soluciones elegidas.

Conclusiones

  • soluciones basadas en for-in (A, J, L, M) son los más rápidos
  • soluciones basadas en JSON.stringify (B, K) son lentos
  • sorprendentemente también solución basada en Object (N) es lento

enter image description here

Beneficios

A continuación, en un fragmento, se presentan 15 soluciones. Si desea ejecutar una prueba de rendimiento en su máquina, haga clic en AQUÍ.

var log = (s,f) => console.log(`${s} --> {}:${f({})}  {k:2}:${f({k:2})}`);

function A(obj) {
  for(var i in obj) return false; 
  return true;
}

function B(obj) {
  return JSON.stringify(obj) === '{}';
}

function C(obj) {
  return Object.keys(obj).length === 0;
}

function D(obj) {
  return Object.entries(obj).length === 0;
}

function E(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

function F(obj) {
  return Object.keys(obj).length === 0 && obj.constructor === Object;
}

function G(obj) {
  return typeof obj === "undefined" || !Boolean(Object.keys(obj)[0]);
}

function H(obj) {
  return Object.entries(obj).length === 0 && obj.constructor === Object;
}

function I(obj) {
  return Object.values( obj  ).every( val => typeof val === "undefined" );
}

function J(obj) {
  for (const key in obj) {
    if (hasOwnProperty.call(obj, key)) {
      return false
    }
  }
  return true;
}

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

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

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

  return true;
}

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

function N(obj) {
  return Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype; 
}

function O(obj) {
  return !(Object.getOwnPropertyNames != undefined ? Object.getOwnPropertyNames(obj).length != 0 : (function(){for(var key in obj) break; return (key != null) && (key != undefined);})())
}

log('A',A);
log('B',B);
log('C',C);
log('D',D);
log('E',E);
log('F',F);
log('G',G);
log('H',H);
log('I',I);
log('J',J);
log('K',K);
log('L',L);
log('M',M);
log('N',N);
log('O',O);

enter image description here

Respondido el 17 de enero de 20 a las 12:01

Mucho de esto no tiene sentido porque está basando todo en un retorno de falso o verdadero. A veces, la programación necesita una declaración if o un operador ternario. solo para tu información - Christian Matthew

Para completar, edité su jsperf para probar obj = {a:1,b:2,c:3} y for(var i in obj) sigue siendo el más rápido jsperf.com/object-empty-ch/2 - madacol

if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

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

respondido 06 nov., 13:13

Esto incluye propiedades no enumerables, en caso de que le importe. - usuario663031

El Object.getOwnPropertyNames ({}). Length es 10 veces más lento que la opción (for ... in ...) - sugiero evitarlo como una forma de probar si un objetc está vacío. - Davidhadas

Object.getOwnPropertyNames(new Date()).length === 0; por lo que esta respuesta puede ser engañosa. - Cjbarth

¿Qué tal usar JSON.stringify? Está casi disponible en todos los navegadores modernos.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

respondido 18 mar '15, 09:03

return (JSON.stringify (obj) == '{}') - Vic

Esto es lento y la velocidad es importante para este tipo de utilidad. Prueba rápida de rendimiento aquí: jsperf.com/empty-object-test - usuario81962

Esta es una opción muy lenta; sugiero usar la opción (para ... en) en su lugar - Davidhadas

Y no funciona para objetos que contienen funciones. - Félix Kling

También arrojará un error si hay una referencia circular en el objeto. Por lo tanto, es lento, poco confiable y puede generar errores y romper todo lo demás. No hay razón para usarlo nunca. - Burak

Pregunta vieja, pero acaba de tener el problema. Incluir JQuery no es realmente una buena idea si su único propósito es verificar si el objeto no está vacío. En cambio, solo en lo profundo Código de JQuery, y obtendrás la respuesta:

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

contestado el 22 de mayo de 17 a las 18:05

Esto solo es útil si algún otro proceso no ha agregado un prototipo a su objeto base. Para que esto sea realmente viable, debe probar obj.hasOwnProperty (nombre) - mpemburn

Acabo de encontrarme con una situación similar. No quería usar JQuery y quería hacer esto usando Javascript puro.

Y lo que hice fue utilizar la siguiente condición y funcionó para mí.

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

Para no igual a, use esto: JSON.stringify(obj) !== '{}'

Mira este pequeño JSFiddle

Respondido 14 Abr '15, 05:04

Fallará para objetos con referencias circulares ya que JSON.stringify arroja específicamente una excepción para ellos. - Pedro Montoto Garcia

@ PedroMontotoGarcía Ok y ¿cómo un objeto vacío tendrá una referencia circular? - KthProg

Si el objeto no está vacío (y también debería funcionar para ellos). - Pedro Montoto Garcia

Esto parece que ya lo mencionó @Ateszki y es una de las formas más lentas de verificar si un objeto no está vacío. - guata

Oh, sí ... me lo perdí. Me encontré con una situación en la que quería lograr este javascript, y después de pensar un poco me di cuenta de esta manera. @ Ateszki, incluso yo pensé en la forma en que lo hiciste. :-) Por cierto, hubo muchas respuestas sobre esto, así que me perdí tu respuesta. - Anish Nair

Hay una forma sencilla si tiene un navegador más nuevo. Object.keys(obj).length == 0

Respondido 29 Abr '12, 20:04

Donde el keys la propiedad proviene? - usuario663031

Se trata de un método estándar en ECMAScript 5.1 - descargar

¿Cómo puede el comentario anterior tener 4 votos a favor? Sí, Object.keys es un método estándar, pero los objetos no tienen una propiedad de claves. Por lo tanto, este código informará cualquier objeto como vacío, excepto que accidentalmente tenga una propiedad llamada key con un valor que de nuevo como una propiedad denominada length que no es cero. ¡Horrible! - avaricioso

Object.keys(new Date()).length === 0; por lo que esta respuesta puede ser engañosa. - Cjbarth

@scravy Object es la clase Object. El objeto tiene un método estático llamado 'claves' que acepta un objeto como argumento. Este método devuelve una matriz de cadenas donde las cadenas son nombres de propiedad. desarrollador.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - señal

El uso de Object.keys (obj) .length (como se sugirió anteriormente para ECMA 5+) es 10 veces más lento para objetos vacíos. manténgase con la opción de la vieja escuela (para ... en).

Probado en Node, Chrome, Firefox e IE 9, resulta evidente que para la mayoría de los casos de uso:

  • (para ... en ...) es la opción más rápida de usar.
  • Object.keys (obj) .length es 10 veces más lento para objetos vacíos
  • JSON.stringify (obj) .length es siempre el más lento (no sorprende)
  • Object.getOwnPropertyNames (obj) .length tarda más que Object.keys (obj) .length puede ser mucho más largo en algunos sistemas.

En resumen, en cuanto al rendimiento, utilice:

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

or

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

Consulte los resultados detallados de las pruebas y el código de prueba en ¿El objeto está vacío?

Respondido 30 Oct 19, 07:10

Object.keys es lento, pero menos código. En una página pequeña, donde se llama a esto ... quizás 10 veces ... ¿Será aún más lento considerando el tiempo de análisis adicional del código adicional? - yanqui

Puede verificar el recuento de las claves de objeto:

if (Object.keys(a).length > 0) {
    // not empty
}

Respondido el 30 de junio de 17 a las 13:06

¿Por qué agregarías un comentario para una respuesta que ya se dio y darías una peor respuesta? stackoverflow.com/a/32108184/4229159 y es la primera respuesta de Abril - alejandro vales

¿Qué pasa si tengo un objeto muy grande y hago eso en cada bucle solo para ver si el objeto estaba vacío? - StefansArya

Esta respuesta no parece agregar nada que la respuesta aceptada no diga. - mickmackusa

  1. Solo una solución. ¿Puede su servidor generar alguna propiedad especial en caso de que no haya datos?

    Por ejemplo:

    var a = {empty:true};
    

    Luego, puede verificarlo fácilmente en su código de devolución de llamada AJAX.

  2. Otra forma de comprobarlo:

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

EDITAR: Si usa cualquier biblioteca JSON (fe JSON.js), puede probar la función JSON.encode () y probar el resultado con una cadena de valor vacía.

respondido 04 mar '13, 12:03

toSource() no es estándar y no funciona en IE u Opera (y potencialmente en otros navegadores que no verifiqué) - Christoph

@Thevs: tal vez tenga una copia diferente de la versión actual de ECMA-262, pero la mía no incluye una toSource propiedad en la sección 15.2.4; según MDC, se introdujo en JS1.3 (es decir, Netscape Navigator 4.06), ¡pero NO en ECMA-262, tercera edición! - Christoph

@Thevs: bueno, al menos 2 proveedores importantes de navegadores no lo implementaron, por lo que no es un estándar de facto, y como no está en ECMA-262, tampoco es real ... - Christoph

Incluso cuando funciona, toSource() es una forma horrible de hacer esto (como es JSON.encode()). Necesita construir una cadena que represente todo su objeto para verificar si está vacío. Existe la sobrecarga de convertir cosas en cadenas, pero además necesitará convertir un millón de cosas si su objeto tiene un millón de propiedades, mientras que en realidad solo mirar una le permitirá saber que no está vacío. - Jaspe

@Thevs la sobrecarga es mayor, incluso si puede ser (No estoy seguro de que sea bajo todas las circunstancias) en el mismo orden de magnitud. Sin embargo, esa respuesta implica devolver falso tan pronto como se encuentre una propiedad diferente, lo que hace que la historia sea diferente todos juntos ... - Jaspe

Creé una función completa para determinar si el objeto está vacío.

Utiliza Object.keys en ECMAScript 5 (ES5) si es posible para lograr el mejor rendimiento (ver tabla de compatibilidad) y alternativas al enfoque más compatible para motores más antiguos (navegadores).

Solución

/**
 * 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;
    }
}

Este es el Esencia para este código.

Y aqui esta el JSFiddle con demostración y una prueba sencilla.

Espero que ayude a alguien. ¡Salud!

Respondido 26 Abr '17, 00:04

Esto falla por un null objeto. - usuario663031

Hola @torazaburo! ¡Gracias por tomar nota! Actualicé todas las fuentes con la implementación correcta. - Slava Fomin II

La longitud de Object.keys ({}). Es 10 veces más lenta que la opción (for ... in ...) - sugiero evitarla como una forma de probar si un objetc está vacío. - Davidhadas

Object.keys(new Date()).length === 0; por lo que esta respuesta puede ser engañosa. - Cjbarth

Según el ES2017 especificación en Object.entries (), la comprobación es sencilla con cualquier navegador moderno:

Object.entries({}).length === 0

Respondido 02 Feb 21, 07:02

¿Hay algún beneficio en usar esto sobre Object.keys or Object.values? - señal de desmayo

@faintsignal usando esos están perfectamente bien. Acabo de agregar entradas ya que no las encontré en los comentarios. - vikrant

Estoy usando esto.

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;
}

P.ej:

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;

desde aquí

Noticias

OR

puede usar la implementación jQuery de isEmptyObject

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

Respondido 05 Feb 20, 08:02

Hola. cuando prueba esta función con número o booleano verdadero o falso, devuelve verdadero y este resultado no es correcto. isObjectEmpty (verdadero). isObjectEmpty (falso). isObjectEmpty (1) - imán

Estamos comprobando si el objeto está vacío, no si el tipo de datos es un objeto. En su caso, para verificar si es un objeto, necesitamos algo como if (typeof a === "object") {...} - kiranvj

Mi opinión:

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

Simplemente, no creo que todos los navegadores implementen Object.keys() actualmente.

Respondido el 31 de enero de 21 a las 18:01

Object.keys(new Date()).length === 0; por lo que esta respuesta puede ser engañosa. - Cjbarth

Depende si consideras que una fecha está siempre "llena" a pesar de que nunca exponga las claves. Pero estoy de acuerdo en que si ese es su plan, agregar alguna instancia complementaria de verificación para el constructor de fecha es una buena opción. - NiKo

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

respondido 01 nov., 11:08

Eso también informará cierto, cuando, por ejemplo, una biblioteca de JavaScript se extiende Object con un método a través de la cadena de prototipos, porque eso es enumerable y el for in instrucción recorre propiedades enumerables. - viam0zah

El siguiente ejemplo muestra cómo probar si un objeto JavaScript está vacío, si por vacío queremos decir que no tiene propiedades propias.

El script funciona en 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

Respondido 20 Jul 18, 13:07

jQuery tiene una función especial isEmptyObject() para este caso:

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

Lea más sobre la http://api.jquery.com/jQuery.isEmptyObject/

Respondido el 25 de enero de 11 a las 14:01

Yo iría a comprobar si tiene al menos una llave. Eso sería suficiente para decirme que no está vacío.

Boolean(Object.keys(obj || {})[0]) // obj || {} checks for undefined

Respondido 19 Feb 21, 15:02

que pasa si la primera llave regresa false valor ? el resultado será false lo cual es incorrecto. - Jimmy Obonyo Abor

He probado para eso. ¿Puede dar un ejemplo práctico? - Tudor Morar

esto es breve y conciso, pero dará como resultado un error de tiempo de ejecución si el objeto no está definido - Mrinmoy

@ Jimmy Obonyo Abor ¿Cómo puede ser una llave? false? - Adrian Bartolomé


puedes usar este simple código que no usó jQuery u otras bibliotecas

var a=({});

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

JSON clase y sus funciones (analizar gramaticalmente y encadenar) son muy útiles pero tienen algunos problemas con IE7 que puedes arreglarlo con este simple código http://www.json.org/js.html.

Otra forma sencilla (forma más sencilla):
puedes usar de esta manera sin usar jQuery or JSON objeto.

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

Respondido el 03 de Septiembre de 13 a las 05:09

JSON.stringify La solución falla si el objeto contiene propiedades que no se pueden establecer en cadenas, como funciones o "indefinido", aunque se reconoce que es un caso extremo. - usuario663031

La mejor manera que encontré:

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

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

    return false;
}

Trabaja 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

respondido 15 mar '17, 13:03

Yo diría que 0 no está vacío ya que en realidad es un número. todo lo demás se ve bien, pero la solución es fácil. en la primera declaración if agregue esto. if (!obj && obj !== 0). - mjwrazor

Bajo el capó, todos los métodos de verificación vacíos en todas las bibliotecas utilizan la lógica de verificación de claves de objeto. Es una forma extraña de hacerlo comprensible, que puede poner en un método, Descrito aquí.

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

Que ha evolucionado en ES5, ahora en pocas palabras, puede verificar la longitud de las claves del objeto, usando Object.Keys método que toma su objeto como parámetro:

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

O si estás usando Lodash (debe ser) entonces.

 _.isEmpty(obj) //==true or false

Respondido el 28 de enero de 19 a las 11:01

Si bien es correcto como una forma extraña de hacer una declaración if, probablemente confundirá a alguien que mantendrá el código después de usted. - Soren

Si jQuery y el navegador web no están disponibles, también hay una función isEmpty en underscore.js.

_.isEmpty({}) // returns true

Además, no asume que el parámetro de entrada sea un objeto. Para una lista o cadena o indefinida, también se convertirá en la respuesta correcta.

Respondido el 14 de enero de 14 a las 03:01

¡Consideración! Tenga cuidado con las limitaciones de 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 ) );

pantallas

    ¡¡Tener cuidado!! ¡obj NO está vacío! obj = {f: function () {}} JSON.stringify (obj) devuelve {}

contestado el 24 de mayo de 11 a las 02:05

La respuesta correcta es:

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

Esto comprueba que:

  • El objeto no tiene propiedades propias (independientemente de la enumerabilidad).
  • El objeto no tiene símbolos de propiedad propios.
  • El prototipo del objeto es exactamente Object.prototype.

En otras palabras, el objeto es indistinguible de uno creado con {}.

Respondido el 05 de junio de 18 a las 02:06

Una solución más sencilla: var a = {};
El caso a está vacío: !Object.keys(a).length devoluciones true.

Respondido 21 ago 20, 18:08

Además de la respuesta de Thevs:

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

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

es jquery + jquery.json

Respondido 26 Feb 10, 12:02

No me gusta usar JSON porque no puede funcionar con estructuras de objetos circulares. - no funciona

Si su página carga jQuery, use $.isEmptyObject(), no desperdicie ciclos con conversiones no obvias. - esquiador

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.