Introduzione
In JavaScript, i concetti di truthy e falsy diventano particolarmente utili quando si lavora con collezioni di dati, come array di prodotti, utenti o risultati provenienti da un’API. Molti metodi degli array, tra cui filter(), find() e some(), utilizzano il valore restituito da una funzione per decidere se un elemento deve essere mantenuto, restituito o considerato valido.
Un valore è truthy quando viene interpretato come vero in un contesto booleano. Un valore è invece falsy quando viene interpretato come falso. Tra i principali valori falsy troviamo:
false0-0"", cioè una stringa vuotanullundefinedNaN
Tutti gli oggetti e gli array sono truthy, anche quando sono vuoti. Questo è un punto importante: [] e {} sono considerati veri nelle condizioni, perché sono oggetti realmente esistenti.
Il sotto-argomento di questo tutorial è l’uso consapevole della truthiness durante il filtraggio e la ricerca di elementi nelle collezioni. L’obiettivo è evitare filtri troppo generici, che potrebbero eliminare dati validi come il numero 0 oppure mantenere elementi che non dovrebbero essere considerati utilizzabili.
Codice completo
const prodotti = [
{ nome: "Tastiera", prezzo: 49, disponibilita: 12 },
{ nome: "Mouse", prezzo: 0, disponibilita: 5 },
{ nome: "", prezzo: 25, disponibilita: 3 },
{ nome: "Monitor", prezzo: 199, disponibilita: 0 },
{ nome: "Webcam", prezzo: null, disponibilita: 8 },
null
];
// Filtro generico: elimina solo i valori falsy.
// È utile per rimuovere null o undefined,
// ma non verifica la qualità degli oggetti.
const elementiPresenti = prodotti.filter(Boolean);
console.log("Elementi presenti:", elementiPresenti);
// Filtro specifico: controlla ogni proprietà in modo esplicito.
const prodottiValidi = prodotti.filter((prodotto) => {
return prodotto !== null
&& typeof prodotto.nome === "string"
&& prodotto.nome.trim() !== ""
&& typeof prodotto.prezzo === "number"
&& !Number.isNaN(prodotto.prezzo)
&& prodotto.prezzo >= 0
&& typeof prodotto.disponibilita === "number"
&& prodotto.disponibilita > 0;
});
console.log("Prodotti validi:", prodottiValidi);
// find() considera truthy il valore restituito dalla callback.
// Qui cerchiamo il primo prodotto realmente disponibile.
const primoDisponibile = prodotti.find((prodotto) => {
return prodotto && prodotto.disponibilita > 0;
});
console.log("Primo prodotto disponibile:", primoDisponibile);
// some() restituisce true appena trova un elemento
// per cui la callback restituisce un valore truthy.
const esisteUnProdottoGratuito = prodotti.some((prodotto) => {
return prodotto
&& typeof prodotto.prezzo === "number"
&& prodotto.prezzo === 0;
});
console.log("Esiste un prodotto gratuito?", esisteUnProdottoGratuito); Spiegazione
Usare filter(Boolean)
Il codice array.filter(Boolean) è una forma compatta per mantenere soltanto gli elementi truthy. In pratica, JavaScript esegue qualcosa di equivalente a:
const risultato = valori.filter((valore) => Boolean(valore)); Questa tecnica è utile quando un array contiene valori come null o undefined e si desidera rimuoverli rapidamente. Tuttavia, il filtro non controlla la struttura degli oggetti. Nell’esempio, un oggetto con nome: "" rimane nell’array perché l’oggetto stesso è truthy, anche se una sua proprietà è una stringa vuota.
Inoltre, filter(Boolean) rimuoverebbe anche valori validi come 0, false e stringhe vuote. Per esempio, se un array contiene prezzi, il prezzo zero potrebbe rappresentare un prodotto gratuito e non un dato mancante.
Controllare le proprietà in modo esplicito
Quando i dati hanno una struttura precisa, è preferibile scrivere condizioni più specifiche. Nell’esempio, il prezzo viene verificato con typeof prodotto.prezzo === "number". In questo modo il valore 0 non viene scartato automaticamente: viene accettato perché è un numero valido.
La condizione prodotto.prezzo >= 0 impedisce invece di accettare prezzi negativi. Per il nome viene usato trim(), così anche una stringa composta solo da spazi viene considerata vuota:
prodotto.nome.trim() !== "" Questa distinzione è importante: verificare semplicemente if (prodotto.nome) impedisce di accettare una stringa vuota, ma non descrive chiaramente tutte le regole di validazione richieste.
Truthy nei metodi find() e some()
Il metodo find() restituisce il primo elemento per cui la callback produce un valore truthy. La condizione:
prodotto && prodotto.disponibilita > 0 prima verifica che prodotto esista. Se il valore è null, l’espressione si interrompe e non prova ad accedere a disponibilita. Questo evita l’errore “Cannot read properties of null”.
Il metodo some(), invece, restituisce un booleano. È adatto per rispondere a domande come “esiste almeno un prodotto gratuito?” o “c’è almeno un elemento disponibile?”. La callback dovrebbe quindi esprimere chiaramente la condizione da verificare, senza affidarsi a una truthiness generica.
Best practice
- Usa
filter(Boolean)solo per rimuovere valori completamente assenti, comenulleundefined, quando anche0,falsee stringhe vuote devono essere eliminati. - Non usare la truthiness come sostituto della validazione. Un oggetto truthy può avere proprietà mancanti, errate o vuote.
- Tratta lo zero con attenzione. Il valore
0è falsy, ma può essere perfettamente valido per prezzi, contatori, coordinate o quantità. - Controlla prima l’oggetto e poi le sue proprietà. Questo evita di accedere a proprietà di
nulloundefined. - Preferisci condizioni leggibili. Espressioni come
prezzo >= 0comunicano meglio l’intenzione rispetto a un genericoif (prezzo). - Ricorda che array e oggetti vuoti sono truthy. Per verificare se un array contiene elementi usa
array.length > 0, non semplicementeif (array). - Usa
Number.isNaN()per controllare i valori numerici non validi.NaNè falsy, ma una validazione esplicita rende il codice più comprensibile.
Riepilogo
Truthy e falsy permettono a JavaScript di valutare i valori in modo implicito, ma nelle collezioni è importante capire esattamente che cosa viene considerato vero o falso. filter(Boolean) è una scorciatoia efficace per eliminare valori assenti, ma non può sostituire una validazione strutturale.
Quando si lavora con dati reali, è meglio controllare esplicitamente le proprietà degli oggetti e distinguere tra un valore mancante e un valore valido ma falsy, come 0. I metodi filter(), find() e some() diventano così strumenti potenti e prevedibili per filtrare, cercare e analizzare array.
