MDC opisuje ==
operatora w następujący sposób :
Jeśli dwa operandy nie są tego samego typu, JavaScript konwertuje operandy, a następnie stosuje ścisłe porównanie. Jeśli którykolwiek z operandów jest liczbą lub wartością logiczną, operandy są konwertowane na liczby, jeśli to możliwe; w przeciwnym razie, jeśli którykolwiek operand jest łańcuchem, drugi operand jest konwertowany na łańcuch, jeśli to możliwe.
Mając to na uwadze, oceniłbym "true" == true
następująco:
- Czy są tego samego typu? Nie
- Czy operand jest liczbą czy wartością logiczną? tak
- Czy możemy zamienić oba na liczbę? Nie (
isNaN(Number("true")) // true
) - Czy któryś z operandów jest łańcuchem? tak
- Czy możemy zamienić inny operand na łańcuch? Tak (
String(true) === "true" // true
)
Skończyło się na ciągach "true"
i "true"
, co powinno dać wynik true
, ale JavaScript pokazuje fałsz.
Co przegapiłem?
javascript
string
equals
Izaak
źródło
źródło
if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
Odpowiedzi:
Ponieważ
"true"
jest konwertowany naNaN
, whiletrue
jest konwertowany na1
. Więc się różnią.Tak jak donosiłeś, oba są konwertowane na liczby, ponieważ przynajmniej
true
można je (zobacz komentarz Erika Reppena), a następnie porównywane.źródło
Can we convert both to a number?
będzie kiedykolwiek fałszywy? Jeśli nawetNaN
jest liczbą, jak ten krok może się nie powieść?Number(true)
iNumber('true')
==
Operator porównania jest zdefiniowana w ECMA 5 jako:zwróć wynik porównania x == ToNumber (y).
zwróć wynik porównania ToNumber (x) == y.
Tak więc "true" == true jest oceniane jako:
===> fałsz
źródło
Zgodnie z algorytmem porównawczym abstrakcyjnej równości
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
jeśli jeden z oprendów jest wartością logiczną, a inny nie, to wartość logiczna jest konwertowana na liczbę 0 lub 1. więc
true == "true"
jest fałszem.źródło