Verificare se un oggetto è vuoto in JavaScript: vanilla e Lodash

Verificare se un oggetto è vuoto in JavaScript: vanilla e Lodash

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».

javascript
const empty = {};

/* -------------------------
  JS Vanilla per i browser recenti
----------------------------*/
Object.keys(empty).length === 0 && empty.constructor === Object
// true

/* -------------------------
  Lodash per i browser datati
----------------------------*/
_.isEmpty(empty)
// true

Che 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.

javascript
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.

javascript
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.

javascript
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?

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 

Ahia, ecco un falso positivo…

Eliminare il falso positivo con constructor

Sistemiamo la cosa aggiungendo un controllo sul costruttore.

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 ✅

Ottimo, il problema è risolto.

Provare il controllo su altri valori

Bene, proviamo il nostro metodo su altri valori e vediamo cosa restituisce.

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

Per ora tutto bene: su ciò che non è un oggetto restituisce false.

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

Attenzione però: questi valori provocano un errore.

javascript

goodEmptyCheck(undefined);
goodEmptyCheck(null);

Migliorare il controllo per null e undefined

Se preferisci che non venga sollevato un TypeError, aggiungi un controllo in più:

javascript
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

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

Sugli oggetti restituisce true.

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

Perfetto, non si lascia ingannare dai nostri oggetti creati con i costruttori.

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 ✅

E siamo coperti anche su null e undefined: restituisce false senza sollevare un TypeError.

javascript
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

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

Underscore

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

jQuery

javascript
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.

JavaScript

Damien Flandrin Sviluppatore web dal 2010, creatore di Gekkode e di Email Impact. Ogni articolo è testato su un progetto reale prima della pubblicazione. Contatti
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.