
Ecco uno snippet per verificare se un oggetto è vuoto oppure no. Sui browser recenti ti basta JavaScript vanilla con il nuovo «Object.keys». Sui browser più datati, installa la libreria Lodash e usa il metodo «isEmpty».
const empty = {};
/* -------------------------
JS Vanilla per i browser recenti
----------------------------*/
Object.keys(empty).length === 0 && empty.constructor === Object
// true
/* -------------------------
Lodash per i browser datati
----------------------------*/
_.isEmpty(empty)
// trueChe cos’è JavaScript vanilla?
JavaScript vanilla non è un nuovo framework né una nuova libreria. È semplicemente JavaScript puro, scritto senza appoggiarsi a librerie come Lodash o jQuery.
A. Verificare un oggetto vuoto sui browser recenti
Per sapere se un oggetto è vuoto possiamo usare la funzione nativa Object.keys.
const empty = {};
Object.keys(empty).length === 0 && empty.constructor === Object;
Perché serve un controllo su constructor?
Ti starai chiedendo a cosa serva empty.constructor. Serve a coprire le istanze di oggetto vuote: in JavaScript esistono 9 costruttori nativi.
new Object();
new String();
new Number();
new Boolean();
new Array();
new RegExp();
new Function();
new Date();
Un oggetto vuoto si può quindi creare con new Object(). Una precisazione: non creare MAI un oggetto tramite il costruttore. È considerata una cattiva pratica, vedi la guida di stile di Airbnb ed ESLint.
const obj = new Object();
Object.keys(obj).length === 0; // true
Da solo, Object.keys restituisce quindi true quando l’oggetto è vuoto ✅. Ma cosa succede se creiamo una nuova istanza con gli altri costruttori?
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
Ahia, ecco un falso positivo…
Eliminare il falso positivo con constructor
Sistemiamo la cosa aggiungendo un controllo sul costruttore.
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 ✅
Ottimo, il problema è risolto.
Provare il controllo su altri valori
Bene, proviamo il nostro metodo su altri valori e vediamo cosa restituisce.
function isEmptyObject(value) {
return Object.keys(value).length === 0 && value.constructor === Object;
}
Per ora tutto bene: su ciò che non è un oggetto restituisce false.
isEmptyObject(100) // false
isEmptyObject(true) // false
isEmptyObject([]) // false
Attenzione però: questi valori provocano un errore.
goodEmptyCheck(undefined);
goodEmptyCheck(null);
Migliorare il controllo per null e undefined
Se preferisci che non venga sollevato un TypeError, aggiungi un controllo in più:
let value;
value // controllo di null e undefined
&& Object.keys(value).length === 0 && value.constructor === Object;
value = null; // null
value = undefined; // undefined
Perfetto, non viene più sollevato alcun errore
B. Verificare un oggetto vuoto sui browser più datati
E se devi supportare browser più vecchi? Hai due possibilità: restare su una versione vanilla oppure affidarti a una libreria.
Verificare un oggetto vuoto con JavaScript
Il metodo classico è meno conciso, ma fa il suo lavoro
function isObjectEmpty(value) {
return (
Object.prototype.toString.call(value) === '[object Object]' &&
JSON.stringify(value) === '{}'
);
}
Sugli oggetti restituisce true.
isObjectEmpty({}); // true ✅
isObjectEmpty(new Object()); // true ✅
Perfetto, non si lascia ingannare dai nostri oggetti creati con i costruttori.
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 ✅
E siamo coperti anche su null e undefined: restituisce false senza sollevare un TypeError.
isObjectEmpty(null); // false
isObjectEmpty(undefined); // false
Verificare un oggetto vuoto con librerie esterne
Le librerie esterne che permettono di verificare gli oggetti vuoti sono tantissime e quasi tutte offrono un ottimo supporto per i browser datati.
Lodash
_.isEmpty({});
// true
Underscore
_.isEmpty({});
// true
jQuery
jQuery.isEmptyObject({});
// true
Vanilla o librerie?
La risposta è: dipende! Quando posso preferisco la soluzione più semplice, perché non amo l’overhead di una libreria esterna. E sulle applicazioni piccole sono troppo pigro per configurarla. Ma se la tua applicazione ha già una libreria installata, usala pure. Conosci la tua applicazione meglio di chiunque altro: scegli ciò che si adatta meglio alla tua situazione.


