Il mio preferito è usare !!
. È anche il metodo raccomandato dalla guida di stile JavaScript di Airbnb 👍
Boolean(value);!!value;
# Convertire valori in booleani
# String
const string = 'string';!!string; // trueBoolean(string); // true
# Number
const number = 100;!!number; // trueBoolean(number); // true
# Falsy Values
In JavaScript, ci sono 6 valori falsi. Se si converte uno di questi in un boolean
, esso restituirà false
.
falseundefinednullNaN0"" (empty string)
Tutto ciò che non è nella lista falsy, restituirà true
👍
Maggiori informazioni su questo, puoi leggere le mie Note sul codice sui valori falsy
# Esempi
Applicando !!
ai valori falsy
!!false; // false!!undefined; // false!!null; // false!!NaN; // false!!0; // false!!''; // false
Applicazione di Boolean
su valori falsificati
Boolean(false); // falseBoolean(undefined); // falseBoolean(null); // falseBoolean(NaN); // falseBoolean(0); // falseBoolean(''); // false
# Come funziona il !funziona
Il primo !
coercizza il valore in un booleano e lo inverte. In questo caso, !value
restituirà false
. Quindi, per invertirlo di nuovo in true
, mettiamo un altro !
su di esso. Da qui il doppio uso !!
.
const value = 'string';!value; // false!!value; // true
# Attenzione al ‘falso’
const value = 'false';!!value; // trueBoolean(value); // true
Nota che il "false"
è tra virgolette '
. Anche se c’è scritto false
, in realtà è una stringa. So che la maggior parte di voi non ci cascherà, ma se siete come me, potreste voler stare attenti a questi divertenti trucchi mentali che la gente potrebbe giocarvi 😂
# Community Input
@tassoevan : Mi piace filtrare i valori falsi dagli array come questo: myArray.filter(Boolean)
@fleonus : Mi piace !+!
solo per essere figo e buttare fuori la gente 😛
# Speed Test
Ecco un test che ho trovato:
boolean vs !!
Sembra che il !!
sia un po’ più veloce del Boolean
# Quale usare?
Ho ricevuto molti commenti su questo post. Alcune persone preferiscono il Boolean
perché è più esplicito.
Ma, Kyle Simpson di You Don’t Know JS, ha detto che entrambi sono espliciti.
// better (works explicitly):if (!!a) {}// also great (works explicitly):if (Boolean(a)) {}
Kyle Simpson: YDKJS – Coercion
Non credo di avere una grande risposta per te. Conoscerete la vostra squadra molto meglio di me. Continuerò ad usare !!
nei miei progetti personali, perché è meno digitato e capisco questa sintassi. Ma se fossi in un team, potrei scegliere Boolean
perché penso che la maggior parte degli sviluppatori lo capirebbe meglio. Non importa quale scegliete, la cosa più importante è essere coerenti. Non saltellare tra i due nella tua base di codice. Sceglietene uno e mantenetelo 💪
Alla fine di un commento fantastico che ho ricevuto:
@patrick_developer: Io dico che uno dovrebbe capirli entrambi nel caso in cui uno si trovi di fronte a diverse basi di codice che usano ciascuno di essi. La conoscenza è potere.
In altre parole, uno non è meglio dell’altro. Questo direi che è più una preferenza. Quindi non si può sbagliare. Ma non privatevi di capire entrambi. Come disse Patrick, “La conoscenza è potere” 💪
# Evita i nuovi booleani
Usa i primitivi invece dei tipi di oggetto
var str = 'str';// Avoidtypeof new Boolean(str); // object// Preferredtypeof Boolean(str); // booleantypeof !!str; // boolean
CJ J.: Vale la pena notare che new Boolean
non è un booleano ma piuttosto un’istanza di Boolean. Le primitive sono più economiche e dovrebbero essere preferite al tipo di oggetto.
CJ J.: new Boolean(str)
restituisce un tipo di oggetto. Boolean(str)
restituisce solo un booleano primitivo. Sospetto che Boolean(str)
sia più veloce di !!str
perché è una sola operazione, ma è anche del tutto possibile che i browser implementino un’ottimizzazione tale che quando vedono !!
sanno di lanciare direttamente l’argomento a una primitiva booleana (invece di fare effettivamente NOT()
due volte di seguito).
CJ J.: Le primitive sono economiche perché sono immutabili in modo da poter condividere i riferimenti e non dover mantenere alcuno stato sull’istanza. È solo true
o false
. Ma new Boolean(str)
è un oggetto. Ha il suo indirizzo di memoria unico e può contenere uno stato interno che è unico per lui. Questo significa che non può semplicemente tenere un riferimento a un’istanza singleton immutabile. Ogni chiamata a new Boolean(str)
istanzia un intero nuovo Boolean()
oggetto.
Grazie: CJ J.
# Rimuovere le stringhe vuote con il costruttore booleano
CJ J.: Questo è il classico esempio. Se ottenete una lista di valori di stringhe separate da virgole e volete filtrare le stringhe vuote, potete passare la funzione booleana del costruttore in Array.prototype.filter ed essa eliminerà automaticamente le stringhe di lunghezza zero lasciando un array di sole stringhe valide.
var str = 'some,list,,of,values';var arr = str.split(',');arr; // arr.filter(Boolean); //
Grazie: CJ J.