Ci sono due problemi separati con i valori di "falso" in JavaScript.
In primo luogo c'è lo schema di conversione ufficiale, che è ciò che viene restituito da Boolean (x). Questo restituisce false quando x è false o 0 o NaN o null o undefined o "" e true altrimenti. Questo è lo stesso comportamento come il
if (condition) {/*true path*/} else {/*false path*/}
che viene, viene eseguito il percorso false se booleana (condizione) avrebbe restituito falso e il vero cammino è eseguito al contrario. Questo comportamento viene spesso utilizzato per verificare se una proprietà è definita. Tuttavia, farlo non è sicuro se non si è certi che la proprietà sarebbe un oggetto o un array se è definito. Il modo più sicuro per verificare se una proprietà è definita è quello di fare
if (property != null) { /*property is defined*/}
che fa in modo che la proprietà non è null o undefined. Se si desidera solo per assicurarsi che la proprietà non è indefinito fanno
if (property !== undefined) { /*property is not undefined (but may be null)*/ }
(notare l'extra = a! ==).
In secondo luogo, ci sono tutti i valori che == false. Questo è tutto ciò che può essere forzato a 0 (che è ciò a cui falso viene forzato). Questo include tutti i valori che convertono in falso tranne NaN (che non può == falso in virtù di esso mai == nulla), null e indefinito. Ma include anche tutti gli oggetti che quando vengono convertiti in una stringa e poi convertiti in un numero sono uguali a 0. Ad esempio, questo include tutto ciò che una volta convertita in una stringa è la stringa vuota "" o "0" o "-0 "o "0" o "0x00" o "000" o "0E0" o "0.0000" ...., per esempio,
({toString: function() {return "-00.0e000";}}) == false
è vero. È interessante notare che questo include l'array vuoto e qualsiasi nidificazione di array contenenti solo un singolo elemento che restituisce una stringa vuota o 0 poiché gli array resi come stringhe mostrano solo i contenuti senza le parentesi. Cioè,
[[[[0]]]] == false; // Because [[[[0]]]].toString() === "0"
[] == false;
[[[""]]] == false;
["0"] == false;
[[({toString: function() {return "0";}})]] == false;
L'algoritmo completo per il calcolo == false è descritto here.
Il motivo per cui questo è importante perché può portare a bug sottili e difficili da trovare se non si capisce la maggior parte di queste regole. I takeaway più importanti sono probabilmente il modo in cui funziona lo if (condition)
e che l'utilizzo di === evita la maggior parte delle altre cose pazzesche.
NaN anziché NAn, null invece di Null (JavaScript fa distinzione tra maiuscole e minuscole) –
Una delle cose che devi amare della programmazione è dover tenere il passo con i termini della lingua (inglese)."falso" è davvero un termine di programmazione legittimo o significa semplicemente "valori falsi"? Se è un termine reale, e non solo un geek, dove è un url che lo definisce, poiché non riesco a trovare una definizione legittima del termine. – Bill
@Bill Suppongo che "verità" e "falsa" siano neologismi allora ... http://javascript.crockford.com/style2.html –