Ogni valore ha un suo "umore" booleano
JavaScript ti permette di mettere qualsiasi valore dove ci si aspetta un booleano: dentro un if, come condizione di un while, accanto a && o ||. Quando lo fai, il valore viene convertito in true o false. I valori che diventano false si chiamano falsy. Tutti gli altri sono truthy.
Nessuna funzione di conversione, nessun cast esplicito: JavaScript lo fa in automatico. Le regole sono fisse e poche, quindi una volta che conosci l'elenco dei falsy, ogni altro caso viene da sé.
L'elenco completo dei falsy
I valori falsy sono esattamente sette. Tutto il resto del linguaggio è truthy.
Tutto qui. L'elenco:
false: il booleano stesso.0e-0: entrambi gli zeri.0n: lo zero BigInt."": la stringa vuota (con apici singoli, doppi o backtick, è lo stesso).null: il valore "niente, di proposito".undefined: il valore "non impostato".NaN: il risultato di calcoli non validi come0 / 0.
Impara a memoria questi sette. Poi, per qualsiasi valore su cui hai dubbi, chiediti: "è uno di quei sette?" Se no, è truthy.
Le sorprese: "0", [] e {}
Qui è dove chi inizia si scotta. Molti valori sembrano vuoti ma sono truthy:
Le stringhe sono falsy solo quando hanno zero caratteri. "0" ha un carattere, quindi è truthy. Array e oggetti sono sempre truthy, anche quando sono vuoti, perché JavaScript li tratta come oggetti, e tutti gli oggetti sono truthy a prescindere da cosa contengono.
Se arrivi da Python, è il cambio di mentalità più grande. In Python [] e {} sono falsy. In JavaScript no.
Controllare se qualcosa è "vuoto" nel modo giusto
Dato che [] e {} sono truthy, non puoi usarli direttamente in un if per controllare se sono vuoti. Sii esplicito:
Lo stesso vale per le stringhe, se vuoi considerare vuota una stringa fatta solo di spazi:
Truthy/falsy è una scorciatoia comoda, non un sostituto del ragionare su cosa significa "vuoto" per i tuoi dati.
Convertire in un vero booleano
A volte ti serve un vero true o false, non solo un valore vagamente truthy. Ci sono due modi idiomatici:
Boolean(x) è la conversione esplicita. !!x è la stessa cosa in forma abbreviata: il primo ! converte in booleano e inverte, il secondo ! inverte di nuovo. Sono comuni entrambi. !! è più breve; Boolean() si legge meglio.
Vedrai spesso !! nelle istruzioni return, quando una funzione deve restituire un booleano pulito:
Truthy e falsy con && e ||
Gli operatori logici non restituiscono true o false: restituiscono uno degli operandi. Quale dei due dipende dalla truthiness:
Ecco perché value || defaultValue è uno schema così diffuso per i valori predefiniti. Ma nasconde una trappola: tratta tutti i valori falsy allo stesso modo, compresi 0 e "", che spesso sono input validi:
Se vuoi ripiegare su un valore predefinito solo con null o undefined, usa invece l'operatore di nullish coalescing ??. Ha una pagina tutta sua.
Promemoria rapido
Stampalo, attaccalo al monitor e vai avanti con la tua vita.
Prossimo passo: iteratori e generatori
Ora che hai in mano condizioni e cicli, il prossimo capitolo mostra come JavaScript permette ai valori di prodursi su richiesta. Iteratori e generatori sono il meccanismo dietro for...of, lo spread e molte API moderne, e sono il prossimo argomento.
Domande frequenti
Quali sono i valori falsy in JavaScript?
Sono esattamente sette: false, 0, -0, 0n (lo zero BigInt), '' (stringa vuota), null, undefined e NaN. Tutto il resto è truthy, compresi '0', 'false', [] e {}. Impara a memoria questo breve elenco di falsy e conoscerai la risposta per ogni altro valore per esclusione.
Un array vuoto è truthy o falsy in JavaScript?
Truthy. if ([]) { ... } esegue il blocco, cosa che sorprende chi arriva da Python o PHP. Array e oggetti sono oggetti, e tutti gli oggetti sono truthy a prescindere dal contenuto. Per controllare se un array è vuoto, usa esplicitamente arr.length === 0.
Come converto un valore in booleano in JavaScript?
In due modi: Boolean(value) è la forma esplicita, e !!value è la scorciatoia (una doppia negazione che converte e poi inverte di nuovo). Entrambe seguono le stesse regole truthy/falsy. Usale quando ti serve un vero true/false, non solo un risultato vagamente truthy.