Newsletter

¿Cómo comprobar si un objeto está vacío en JavaScript?

¿Cómo comprobar si un objeto está vacío en JavaScript?

Aquí tienes un fragmento de código para comprobar si un objeto está vacío. En los navegadores recientes te basta con JavaScript vanilla y el moderno « Object.keys ». Para los navegadores antiguos, instala la biblioteca Lodash y usa el método « isEmpty ».

javascript
const empty = {};

/* -------------------------
  Vanilla JS para navegadores recientes
----------------------------*/
Object.keys(empty).length === 0 && empty.constructor === Object
// true

/* -------------------------
  Lodash para navegadores antiguos
----------------------------*/
_.isEmpty(empty)
// true

¿Qué es JavaScript Vanilla?

JavaScript Vanilla no es un framework nuevo ni una biblioteca nueva. Es simplemente JavaScript a secas, sin recurrir a una biblioteca como Lodash o jQuery.

A. Comprobar un objeto vacío en los navegadores recientes

Podemos usar la función nativa Object.keys para comprobar si un objeto está vacío.

javascript
const empty = {};

Object.keys(empty).length === 0 && empty.constructor === Object;

¿Por qué hace falta comprobar además el constructor?

Quizá te preguntes por qué necesitamos añadir empty.constructor. Pues para cubrir las instancias de objeto vacías. En JavaScript existen 9 constructores nativos.

javascript
new Object();

new String();
new Number();
new Boolean();
new Array();
new RegExp();
new Function();
new Date();

Así que podemos crear un objeto vacío con new Object(). Ojo: NUNCA deberías crear un objeto mediante el constructor. Se considera una mala práctica, tal y como explican la guía de estilo de Airbnb y ESLint.

javascript
const obj = new Object();

Object.keys(obj).length === 0; // true

Con solo Object.keys obtenemos true cuando el objeto está vacío ✅. Pero ¿qué ocurre si creamos una nueva instancia de objeto con esos otros constructores?

javascript
function badEmptyCheck(value) {
  return Object.keys(value).length === 0;
}

badEmptyCheck(new String());    // true 
badEmptyCheck(new Number());    // true 
badEmptyCheck(new Boolean());   // true 
badEmptyCheck(new Array());     // true 
badEmptyCheck(new RegExp());    // true 
badEmptyCheck(new Function());  // true 
badEmptyCheck(new Date());      // true 

Vaya, tenemos un falso positivo…

Resolver el falso positivo con constructor

Vamos a arreglarlo añadiendo una comprobación del constructor.

javascript
function goodEmptyCheck(value) {
  Object.keys(value).length === 0
    && value.constructor === Object; // constructor
}

goodEmptyCheck(new String());   // false ✅
goodEmptyCheck(new Number());   // false ✅
goodEmptyCheck(new Boolean());  // false ✅
goodEmptyCheck(new Array());    // false ✅
goodEmptyCheck(new RegExp());   // false ✅
goodEmptyCheck(new Function()); // false ✅
goodEmptyCheck(new Date());     // false ✅

¡Perfecto! Problema resuelto.

Probar la comprobación con otros valores

Muy bien, probemos nuestro método con otros valores y veamos qué obtenemos.

javascript
function isEmptyObject(value) {
  return Object.keys(value).length === 0 && value.constructor === Object;
}

De momento pinta bien: devuelve false para lo que no es un objeto.

javascript
isEmptyObject(100)  // false
isEmptyObject(true) // false
isEmptyObject([])   // false

¡Pero cuidado! Estos valores provocan un error.

javascript

goodEmptyCheck(undefined);
goodEmptyCheck(null);

Mejorar la comprobación para null y undefined

Si prefieres que no lance un TypeError, añade una comprobación más:

javascript
let value;

value // comprobación de null y undefined
 && Object.keys(value).length === 0 && value.constructor === Object;

value = null;       // null
value = undefined;  // undefined

Listo, ya no se lanza ningún error.

B. Comprobar un objeto vacío en los navegadores antiguos

¿Y si necesitas dar soporte a navegadores antiguos? Tenemos dos opciones: quedarnos en vanilla o tirar de una biblioteca.

Comprobar un objeto vacío con JavaScript

La forma clásica no es tan concisa, pero cumple su función.

javascript
function isObjectEmpty(value) {
  return (
    Object.prototype.toString.call(value) === '[object Object]' &&
    JSON.stringify(value) === '{}'
  );
}

Devuelve true para los objetos.

javascript
isObjectEmpty({});           // true ✅
isObjectEmpty(new Object()); // true ✅

Estupendo: no se deja engañar por nuestros objetos creados con constructores.

javascript
isObjectEmpty(new String());   // false ✅
isObjectEmpty(new Number());   // false ✅
isObjectEmpty(new Boolean());  // false ✅
isObjectEmpty(new Array());    // false ✅
isObjectEmpty(new RegExp());   // false ✅
isObjectEmpty(new Function()); // false ✅
isObjectEmpty(new Date());     // false ✅

Y también cubrimos null y undefined. Devuelve false en lugar de lanzar un TypeError.

javascript
isObjectEmpty(null);      // false
isObjectEmpty(undefined); // false

Comprobar un objeto vacío con bibliotecas externas

Hay montones de bibliotecas externas para comprobar objetos vacíos, y la mayoría ofrece un soporte excelente para los navegadores antiguos.

Lodash

javascript
_.isEmpty({});
// true

Underscore

javascript
_.isEmpty({});
// true

jQuery

javascript
jQuery.isEmptyObject({});
// true

Vanilla frente a bibliotecas

La respuesta es: depende. Soy muy partidario de ir a lo sencillo siempre que se pueda, porque no me gusta el coste añadido de una biblioteca externa. Además, en aplicaciones pequeñas me da pereza configurarla. Pero si tu aplicación ya tiene una biblioteca externa instalada, adelante, úsala. Nadie conoce tu aplicación mejor que tú: elige lo que mejor le convenga.

JavaScript

Damien Flandrin Desarrollador web desde 2010, creador de Gekkode y de Email Impact. Cada artículo se prueba en un proyecto real antes de publicarse. Contacto
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.