Mengapa “true” == true menunjukkan false di JavaScript?

89

MDC menjelaskan ==operator sebagai berikut :

Jika kedua operan tidak berjenis sama, JavaScript mengonversi operan tersebut lalu menerapkan perbandingan yang ketat. Jika salah satu operan adalah bilangan atau boolean, operan akan diubah menjadi bilangan jika memungkinkan; else jika salah satu operan adalah string, operan lain akan diubah menjadi string jika memungkinkan.

Dengan pemikiran ini, saya akan mengevaluasi "true" == truesebagai berikut:

  1. Apakah mereka dari tipe yang sama? Tidak
  2. Apakah operan berupa bilangan atau boolean? Iya
  3. Bisakah kita mengonversi keduanya menjadi angka? Tidak ( isNaN(Number("true")) // true)
  4. Apakah salah satu operan adalah string? Iya
  5. Bisakah kita mengonversi operan lain menjadi string? Ya ( String(true) === "true" // true)

Saya berakhir dengan string "true"dan "true", yang seharusnya mengevaluasi true, tetapi JavaScript menunjukkan salah.

Apa yang saya lewatkan?

Isaac
sumber
Relevan: es5.github.com/#x11.9.1
zzzzBov
6
Dengan begitu banyak JavaScript, dunia adalah tempat yang menakutkan: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "tidak ya"
pengguna1068352
1
Saya harus mengatakan, saya terkejut, dan itu sangat bodoh bahwa ini terjadi. Namun alasan lain untuk selalu selalu menggunakan ===
BT
@ user1068352 periksa kekacauannya :) dorey.github.io/JavaScript-Equality-Table
João Pimentel Ferreira

Jawaban:

89

Karena "true"diubah menjadi NaN, sementara truediubah menjadi 1. Jadi mereka berbeda.

Seperti yang Anda laporkan, keduanya diubah menjadi angka, karena setidaknya truebisa (lihat komentar Erik Reppen), lalu dibandingkan.

MaxArt
sumber
Bisakah Anda memberi tahu saya kapan langkah itu Can we convert both to a number?akan salah? Jika NaNbilangan genap , bagaimana langkah ini bisa gagal?
Isaac
5
Baik vs. tidak keduanya. Jika keduanya menghasilkan NaN, mereka akan beralih ke evaluasi string. Jika hanya satu yang bisa dikonversi, masih ada perbandingan angka.
Erik Reppen
2
Sebenarnya ada beberapa objek aneh di Javascript yang berperilaku cukup aneh. Misalnya, dokumen XML di IE <9 memunculkan kesalahan saat Anda mencoba mengubahnya menjadi angka.
MaxArt
Anda dapat melihat konversinya sendiri dengan melakukan Number(true)danNumber('true')
Erik Reppen
10

The ==operator perbandingan yang didefinisikan dalam ECMA 5 sebagai:

  1. Jika Type (x) adalah Number dan Type (y) adalah String,
    kembalikan hasil perbandingan x == ToNumber (y).
  2. Jika Type (x) adalah String dan Type (y) adalah Number,
    kembalikan hasil perbandingan ToNumber (x) == y.
  3. Jika Type (x) adalah Boolean, kembalikan hasil perbandingan ToNumber (x) == y.
  4. Jika Type (y) adalah Boolean, kembalikan hasil perbandingan x == ToNumber (y).

Jadi, "true" == true dievaluasi sebagai:

  1. "true" == ToNumber (true)   (melalui aturan 7)
  2. "benar" == 1
  3. ToNumber ("true") == 1   (melalui aturan 5)
  4. NaN == 1

===> false

nobitavn94
sumber
3

Menurut Algoritma Perbandingan Kesetaraan Abstrak

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

jika salah satu oprend adalah boolean dan yang lainnya bukan, boolean adalah konverter ke angka 0 atau 1. jadi true == "true"salah.

Zohaib Ijaz
sumber
Apakah saya menyimpulkan dengan benar dengan cara berikut? "true" == true menjadi "true" == 1 dan kemudian menjadi "true" == "1" Itulah mengapa mereka mengembalikan false?
vuquanghoang