Sto imparando a proposito di ==
rispetto a ===
e ho trovato questa risposta che è stata molto utile per comprendere il concetto. Comunque mi sono interrogato su uno degli esempi:
'0' == false // true
Questo potrebbe avere senso, dal momento che ==
non controlla il tipo. Ma poi ho provato alcune possibili coercizioni nella console e ho trovato quanto segue:
Boolean('0') // true String(false) // "false"
Avrei pensato '0' == false
ha lo stesso valore di verità di '0' === String(false)
, ma non sembra essere il caso.
Quindi, come funziona effettivamente la coercizione? C’è un tipo più basilare che mi manca?
"0"
è una stringa contenente il carattere 0 , non è il valore numerico 0
. L’unico valore string-type che restituisce false
è ""
.
"0"
è vero .
La sezione 9.2 della specifica ECMAScript 262 definisce in che modo i diversi tipi vengono convertiti in booleano:
Argument Type Result Undefined false Null false Boolean The result equals the input argument (no conversion). Number The result is false if the argument is +0, −0, or NaN; otherwise the result is true. String The result is false if the argument is the empty String (its length is zero); otherwise the result is true. Object true
Questo, tuttavia, è strettamente seguito solo quando si effettua il confronto usando ===
.
Quando usi Boolean('0')
stai convertendo il valore '0'
in Boolean (che è lo stesso che usare !!'0'
). Quando si confronta liberamente '0'
con false
, il valore booleano viene convertito in un numero (come definito qui ). false
, quando convertito in un numero, diventa 0
. Ciò significa che il calcolo finale è '0' == 0
che equivale a true
.
Per riassumere la parte pertinente della sezione collegata delle specifiche ECMAScript sopra:
'0'
e y = false
. Nel nostro caso, un’implementazione JavaScript di questo sarebbe:
var x = '0', // x = "0" y = false; // y = false if (typeof y === "boolean") { y = +y; // y = 0 } console.log( x == y ); // "0" == 0
-> true
Rendere le cose più confuse per un mondo completamente nuovo nel mondo della programmazione:
Boolean('false') true Boolean('true') true
Penso che sia più facile e più intuitivo da usare !!
operatore per qualche ragione. Non so se ho senso, ma non ho mai usato Boolean()
Rispondendo alla domanda, ho trovato quella discussione utile: Differenza tra == e === in JavaScript