Come funziona esattamente la conversione di tipo di dati di JavaScipt per l'operatore "=="?

Recentemente ho notato qualcosa di strano quando ho usato if( ... == true) in JavaScript. L'operatore == dovrebbe tentare di convertire i tipi di dati specificati per essere gli stessi. Ma alcuni casi non sembrano farlo come ci aspetteremmo:

 if ( 42 == true ) // false ( Only 1 is true ) if ( "Hello World" == true ) // false ( false for any string ) 

Anche se se li convertii facendo !! sia a 42 che a "someString" risultano true :

 if ( !!42 === true ) // Shows that 42 cast to a boolean is true. if ( !!"Hello World" === true ) // Same for strings 

Nota se lo commuto intorno a if( true == ... ) i risultati sono uguali. Mi sto chiedendo esattamente cosa sta succedendo, perché il == sta convertendo questi oggetti stranamente quando convertono in true . Come è JavaScript che prova a convertire questi elementi? Sta cercando di convertire i booleani in un number o una string invece?

La mia domanda principale sarebbe esattamente come funziona l'operatore JavaScript ( == ) quando si tenta di convertire diversi tipi di dati per essere gli stessi in un'espressione, quando un boolean è nell'espressione in questo caso?

Edit: Voglio notare che mentre ho fatto uso !! nella mia domanda, è stato semplicemente dimostrare che se converto i dati tipologici dati in Booleans che veramente si rivelano da true, mentre quando == tentativi di convertire il risultato è diverso. Questa domanda non è in alcun modo chiedendo a che cosa !! è.

    Come dice Crockford: "Le regole che comportno sono complicate e inimmaginabili". La specifica li definisce tutti nella sezione 11.9.3 (indicata da @Oriol in un commento a OP).

    Per i due casi forniti:

     if ( 42 == true ) // false ( Only 1 is true ) if ( "Hello World" == true ) // false ( false for any string ) 

    Nel caso 1, y è un boolean, quindi viene convertito in un numero (passo 7). La conversione del numero di true è 1. Quindi ora stiamo valutando 42 == 1 . Questo è ovviamente falso.

    Nel caso 2, y è ancora una booleana, ma questa volta, x è una string. Per il punto 7, y viene convertito in un numero, quindi il confronto è ora "Hello World" == 1 . Per passo 5, x è ora convertito in un numero. La rappresentazione numbersca di una string arbitraria è NaN . Ora NaN == 1 viene confrontato. Come si dice nel passaggio 1ai, questo è falso.

    Di nuovo, come diceva Crockford …

    Mi sembra che == significa "valuta allo stesso valore". 42 non è uguale a true poiché true viene convertito in un integer per il confronto, e 42 != 1 . Ma se le persone vogliono convertire 42 in un boolean, fai semplicemente if (42) , oppure puoi farlo !! non è un trucco. La maggior parte delle persone fa solo if (42) , convertendo il valore non zero a quello non vuoto a un bool con il parentetico.

    (x == true) dovrebbe essere utilizzato solo quando x si prevede che sia 0 o 1, vero o falso.

    E io ti conosco la differenza tra == e === già.

     (1 == true) // true (1 === true) // false, because data types aren't converted when using === 

    Per ulteriori informazioni sulle conversioni di tipo automatico e sui collegamenti di assegnazione, consiglio di leggere questa pagina . Se non risponde specificamente alla tua domanda, fornisce alcuni esempi che illustrano quando si dovrebbe essere specifico per quello che stai cercando.