Come funziona la coercizione di tipo JS?

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:

  1. Sia x = '0' e y = false .
  2. Controlla se il tipo di y è booleano.
  3. Se è vero, converti y in un numero.
  4. Confronta x con l’equivalente numerico di y .

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