Perché "true" == true mostra false in JavaScript?


89

MDC descrive l' ==operatore come segue :

Se i due operandi non sono dello stesso tipo, JavaScript converte gli operandi quindi applica un confronto rigoroso. Se uno degli operandi è un numero o un booleano, gli operandi vengono convertiti in numeri se possibile; altrimenti se uno degli operandi è una stringa, l'altro operando viene convertito in una stringa, se possibile.

Con questo in mente, valuterei "true" == truequanto segue:

  1. Sono dello stesso tipo? No
  2. L'operando è un numero o un valore booleano?
  3. Possiamo convertirli entrambi in un numero? No ( isNaN(Number("true")) // true)
  4. Uno degli operandi è una stringa?
  5. Possiamo convertire l'altro operando in una stringa? ( String(true) === "true" // true)

Ho finito con le stringhe "true"e "true", che dovrebbe restituire true, ma JavaScript mostra false.

Cosa mi sono perso?



6
Con così tanto JavaScript in giro, il mondo è un posto spaventoso: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "no sì"
user1068352

1
Devo dire che sono sorpreso, ed è così stupido che questo accada. Ancora un altro motivo per utilizzare sempre sempre ===
BT

Risposte:


89

Perché "true"viene convertito in NaN, mentre trueviene convertito in 1. Quindi differiscono.

Come hai segnalato, entrambi vengono convertiti in numeri, perché almeno truepossono essere (vedi il commento di Erik Reppen), e quindi confrontati.


Puoi dirmi quando il passaggio Can we convert both to a number?sarà mai falso allora? Se anche NaNè un numero, come può mai fallire questo passaggio?
Isaac

5
O contro nessuno dei due. Se entrambi risultassero in NaN, passerebbero alla valutazione della stringa. Se solo uno può essere convertito, c'è ancora un confronto numerico.
Erik Reppen

2
In realtà ci sono alcuni oggetti strani in Javascript che si comportano in modo abbastanza strano. Ad esempio, i documenti XML in IE <9 generano un errore quando si tenta di convertirli in numeri.
MaxArt

Puoi vedere le conversioni da solo facendo Number(true)eNumber('true')
Erik Reppen

10

L' ==operatore di confronto è definito in ECMA 5 come:

  1. Se Tipo (x) è Numero e Tipo (y) è Stringa,
    restituisce il risultato del confronto x == ToNumber (y).
  2. Se Type (x) è String e Type (y) è Number,
    restituisce il risultato del confronto ToNumber (x) == y.
  3. Se Type (x) è Boolean, restituisce il risultato del confronto ToNumber (x) == y.
  4. Se Type (y) è Boolean, restituisce il risultato del confronto x == ToNumber (y).

Quindi, "true" == true viene valutato come:

  1. "true" == ToNumber (true)   (tramite la regola 7)
  2. "true" == 1
  3. ToNumber ("true") == 1   (tramite la regola 5)
  4. NaN == 1

===> falso


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.