¡Encontré este problema al depurar una aplicación, y las otras respuestas no resuelven esto !
Con el siguiente caso de uso:
class Foo { get foo() { return 'foo'; } } const value = new Foo();Las siguientes soluciones populares no funcionan:
!Object.keys(value).length; // true !Object.entries(value).length; // true !Object.getOwnPropertyNames(value).length; // trueTampoco es esta solución :
function isEmpty(obj) { for (var prop in obj) { return false; } return true; } isEmpty(value); // true Para ser claros, Foo tiene un captador y no debe considerarse vacío.
En otras palabras, espero estos resultados de estos casos de uso:
const value1 = new class {}; // value1 is empty const value2 = new class { get foo() { return 'foo'; } } // value2 is not empty const value3 = {}; // value3 is empty const value4 = { foo:'foo' }; // value4 is not empty const value5 = Object.create(null); // value5 is empty const value6 = Object.create(null); value6.foo = 'foo'; // value6 is not empty¿Cómo se puede evaluar esto de forma fiable?
Según MDN :
Al usar get, la propiedad se definirá en el prototipo de la instancia.
En tu ejemplo de Foo:
class Foo { get foo() { return 'foo'; } } const value = new Foo(); console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(value))); // check if 'empty' (has only "constructor") console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(value)).length === 1);Si desea una función que cubra todos los casos de ejemplo, puede usar esto:
function isEmpty(obj) { const proto = Object.getPrototypeOf(obj); return (Object.keys(obj).length === 0) && ( proto === null || proto === Object.prototype || (Object.getOwnPropertyNames(proto).length === 1) ); } const value1 = new class {}; // value1 is empty const value2 = new class { get foo() { return 'foo'; } } // value2 is not empty const value3 = {}; // value3 is empty const value4 = { foo:'foo' }; // value4 is not empty const value5 = Object.create(null); // value5 is empty const value6 = Object.create(null); value6.foo = 'foo'; // value6 is not empty [value1, value2, value3, value4, value5, value6] .map((v, i) => `value${i + 1} is ${isEmpty(v) ? "empty" : "not empty"}`) .forEach((v) => console.log(v));