Tại sao “true” == true hiển thị false trong JavaScript?


89

MDC mô tả ==nhà điều hành như sau :

Nếu hai toán hạng không cùng loại, JavaScript sẽ chuyển đổi các toán hạng sau đó áp dụng so sánh chặt chẽ. Nếu một trong hai toán hạng là một số hoặc một boolean, các toán hạng được chuyển đổi thành số nếu có thể; khác nếu một trong hai toán hạng là một chuỗi, toán hạng kia được chuyển đổi thành một chuỗi nếu có thể.

Với suy nghĩ này, tôi sẽ đánh giá "true" == truenhư sau:

  1. Chúng có cùng loại không? Không
  2. Toán hạng là một số hay boolean? Đúng
  3. Chúng ta có thể chuyển đổi cả hai thành một số không? Không ( isNaN(Number("true")) // true)
  4. Toán hạng có phải là một chuỗi không? Đúng
  5. Chúng ta có thể chuyển đổi toán hạng khác thành một chuỗi không? ( String(true) === "true" // true)

Tôi đã kết thúc với các chuỗi "true""true"sẽ đánh giá thành true, nhưng JavaScript hiển thị sai.

Tôi đã bỏ lỡ điều gì?



6
Với rất nhiều JavaScript xung quanh, thế giới là một nơi đáng sợ: if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}---> "không có"
user1068352

1
Tôi phải nói rằng, tôi bị bội thực, và thật là ngu ngốc khi điều này xảy ra. Tuy nhiên, một lý do khác để luôn luôn sử dụng ===
BT

@ user1068352 kiểm tra sự hỗn loạn :) dorey.github.io/JavaScript-Equality-Table
João Ferreira Pimentel

Câu trả lời:


89

Bởi vì "true"được chuyển đổi thành NaN, trong khi trueđược chuyển đổi thành 1. Vì vậy, chúng khác nhau.

Giống như bạn đã báo cáo, cả hai đều được chuyển đổi thành số, vì ít nhất truecó thể được (xem bình luận của Erik Reppen), và sau đó so sánh.


Bạn có thể cho tôi biết khi nào thì bước Can we convert both to a number?này sẽ sai không? Nếu chẵn NaNlà một con số, làm thế nào mà bước này có thể không thành công?
Isaac

5
Cả và không. Nếu cả hai đều dẫn đến NaN, chúng sẽ chuyển sang đánh giá chuỗi. Nếu chỉ có thể chuyển đổi một, vẫn có một số so sánh.
Erik Reppen

2
Thực tế có một số đối tượng kỳ lạ trong Javascript hoạt động khá kỳ lạ. Ví dụ, tài liệu XML trong IE <9 gây ra lỗi khi bạn cố gắng chuyển đổi chúng thành số.
MaxArt

Bạn có thể thấy các chuyển đổi bản thân bằng cách thực hiện Number(true)Number('true')
Erik Reppen

10

Các ==toán tử so sánh được quy định tại ECMA 5 như sau:

  1. Nếu Kiểu (x) là Số và Kiểu (y) là Chuỗi,
    trả về kết quả của phép so sánh x == ToNumber (y).
  2. Nếu Kiểu (x) là Chuỗi và Kiểu (y) là Số, hãy
    trả về kết quả của phép so sánh ToNumber (x) == y.
  3. Nếu Kiểu (x) là Boolean, trả về kết quả của phép so sánh ToNumber (x) == y.
  4. Nếu Kiểu (y) là Boolean, trả về kết quả của phép so sánh x == ToNumber (y).

Vì vậy, "true" == true được đánh giá là:

  1. "true" == ToNumber (true)   (thông qua quy tắc 7)
  2. "true" == 1
  3. ToNumber ("true") == 1   (thông qua quy tắc 5)
  4. NaN == 1

===> sai


3

Theo thuật toán so sánh bình đẳng trừu tượng

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

nếu một trong các oprends là boolean và không phải là boolean, boolean là bộ chuyển đổi thành số 0 hoặc 1. do đó true == "true"sai.


Tôi đã suy luận đúng theo cách sau? "true" == true trở thành "true" == 1 và sau đó trở thành "true" == "1" Đó là lý do tại sao chúng trả về false?
vuquanghoang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.