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

Resuelto falmp asked hace 15 años • 41 respuestas

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?

falmp avatar Mar 25 '09 08:03 falmp
Aceptado

Puede utilizar un bucle for…in con una prueba Object.hasOwn( ECMA 2022+ ) para comprobar si un objeto tiene propiedades propias:

function isEmpty(obj) {
  for (const prop in obj) {
    if (Object.hasOwn(obj, prop)) {
      return false;
    }
  }

  return true;
}

Si también necesita distinguir {}objetos vacíos tipo - de otros objetos sin propiedades propias (por ejemplo, Dates), puede realizar varias comprobaciones de tipos (y lamentablemente específicas de las necesidades):

function isEmptyObject(value) {
  if (value == null) {
    // null or undefined
    return false;
  }

  if (typeof value !== 'object') {
    // boolean, number, string, function, etc.
    return false;
  }

  const proto = Object.getPrototypeOf(value);

  // consider `Object.create(null)`, commonly used as a safe map
  // before `Map` support, an empty object as well as `{}`
  if (proto !== null && proto !== Object.prototype) {
    return false;
  }

  return isEmpty(value);
}

Tenga en cuenta que al comparar con Object.prototypeobjetos similares en este ejemplo no se podrán reconocer objetos entre dominios.

No utilice Object.keys(obj).length . Es de complejidad O(N) porque crea una matriz que contiene todos los nombres de propiedades solo para obtener la longitud de esa matriz. La iteración sobre el objeto logra el mismo objetivo pero es O(1).

Para compatibilidad con motores JavaScript que no admiten ES 2022+, constse puede reemplazar con vary Object.hasOwncon Object.prototype.hasOwnProperty.call:

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

  return true
}

Muchas bibliotecas populares también proporcionan funciones para comprobar si hay objetos vacíos:

jQuery :

jQuery.isEmptyObject({}); // true

lodash :

_.isEmpty({}); // true

Guion bajo :

_.isEmpty({}); // true

hoek :

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

ExtJS :

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

AngularJS (versión 1) :

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

Ramda :

R.isEmpty({}); // true
Adam Zerner avatar Aug 20 '2015 01:08 Adam Zerner

Si la compatibilidad con ECMAScript 5 está disponible, puede utilizar Object.keys():

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

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

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

    return true;
}
Christoph avatar Mar 25 '2009 01:03 Christoph

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

Erik Töyrä Silfverswärd avatar May 19 '2010 14:05 Erik Töyrä Silfverswärd