¿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?
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, Date
s), 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.prototype
objetos 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+, const
se puede reemplazar con var
y Object.hasOwn
con 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
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;
}
Para aquellos de ustedes que tienen el mismo problema pero usan jQuery, pueden usar jQuery.isEmptyObject .