2009-03-20 28 views
10

Nếu tôi làm 0 == "0", nó sẽ đánh giá là đúng. Hãy thử,Trong Javascript, <int-value> == "<int-value>" đánh giá là đúng. Tại sao nó như vậy?

if(-777 == "-777") alert("same"); 

cảnh báo sẽ xảy ra.

Và, điều đáng chú ý là true == "true" không đánh giá đúng. Hãy thử,

if(false == "false") alert("same"); 

cảnh báo không xảy ra.

Tại sao lại như vậy?

+0

Đây là bản sao của http://stackoverflow.com/questions/359494/javascript-vs –

+0

Paolo, tôi nghĩ câu hỏi của tôi hơi khác một chút. Câu hỏi khác là '== vs ==='). Và trong câu hỏi của tôi có bool == "" này cũng là câu hỏi khác không bao gồm. Nhưng, hai câu hỏi có liên quan. –

+1

Các câu hỏi có thể không được diễn đạt giống nhau nhưng khái niệm giống nhau ở cả hai. –

Trả lời

32

Hành vi của == là một chút dài, nhưng rõ ràng trong ecma-262 spec:

11.9.3 Tóm tắt bình đẳng So sánh thuật toán

Việc so sánh x == y, trong đó x và y là các giá trị, tạo đúng hoặc sai. một so sánh như vậy được thực hiện như sau:

  1. Nếu Type (x) là khác nhau từ loại (y), đi đến bước 14.
  2. Nếu Type (x) là Không xác định, trở thành sự thật.
  3. Nếu loại (x) là Null, trả về true.
  4. Nếu loại (x) không phải là số, hãy chuyển đến bước 11.
  5. Nếu x là NaN, trả về false.
  6. Nếu y là NaN, trả về false.
  7. Nếu x có cùng giá trị số với y, trả về giá trị true.
  8. Nếu x là +0 và y là −0, trả về giá trị true.
  9. Nếu x bằng −0 và y là +0, trả về giá trị true.
  10. Trả về false.
  11. Nếu loại (x) là chuỗi, sau đó trả về true nếu x và y chính xác giống nhau chuỗi ký tự (cùng độ dài và các ký tự tương ứng ở vị trí tương ứng). Nếu không, trả về false.
  12. Nếu loại (x) là Boolean, trả về true nếu x và y đều đúng hoặc cả hai sai. Nếu không, trả về false.
  13. Trả về true nếu x và y tham chiếu đến cùng một đối tượng hoặc nếu chúng tham chiếu đến đối tượng được kết nối với nhau (xem 13.1.2). Nếu không, trả về false.
  14. Nếu x là null và y không xác định, trả về true.
  15. Nếu x là không xác định và y là null, trả về true.
  16. Nếu loại (x) là số và loại (y) là chuỗi, trả lại kết quả của số so sánh x == ToNumber (y).
  17. Nếu loại (x) là chuỗi và loại (y) là số, trả về kết quả của so sánh ToNumber (x) == y.
  18. Nếu loại (x) là Boolean, trả về kết quả của phép so sánh ToNumber (x) == y.
  19. Nếu loại (y) là Boolean, trả về kết quả của phép so sánh x == ToNumber (y).
  20. Nếu loại (x) là chuỗi hoặc số và loại (y) là đối tượng, trả lại kết quả của phép so sánh x == ToPrimitive (y).
  21. Nếu loại (x) là đối tượng và loại (y) là chuỗi hoặc số, trả về kết quả của so sánh ToPrimitive (x) == y.
  22. Trả về false.

Bước 16 áp dụng cho ví dụ cựu của bạn:

0 == "0"   // apply 16 
≡ 0 == toNumber("0") 
≡ 0 == 0    // apply 7 
≡ true 

Và bước 18, sau đó bước 16, áp dụng cho sau này:

true == "true"   // apply 18 
≡ toNumber(true) == "true" 
≡ 1 == "true"    // apply 16 
≡ 1 == toNumber("true") 
≡ 1 == NaN     // apply 6 
≡ false 
+6

+0.8 cho câu trả lời tuyệt vời, +0.2 để tìm ký tự 01 – nickf

+0

thực sự rất hay. bạn đã trả lời tốt cả hai câu hỏi. –

+0

Tôi nghĩ đây là câu trả lời được chấp nhận đầu tiên của tôi, cảm ơn các bạn!:) –

1

Javascript không truyền "false" thành boolean false, chỉ cho chuỗi "false".

Bạn có thể lỏng lẻo truyền các giá trị chuỗi vào số nguyên tương đương, do đó ví dụ đầu tiên của bạn hoạt động.

+0

Javascript phôi "false" thành "false"? –

+0

bool (false) bằng str ("0"), bool (true) bằng str ("1") – nickf

+0

Đúng, ý tôi là nó tương ứng với 0 và 1 cho sai và đúng. –

12

Việc làm này:

if(5 == "5") 

Làm javascript chuyển đổi 5 đầu tiên một chuỗi. Hãy thử điều này:

if(5 === "5") 

Làm loại đánh giá Javascript là tốt.

Đây thực sự là bản sao của số này question nơi được giải thích rất rõ.

7

Vì Javascript được nhập sai, nó sẽ tự động truyền biến của bạn tùy thuộc vào thao tác và loại biến khác trong hoạt động.

alert ("5" - 1); // 4 (int) 
alert ("5" + 1); // "51" (string) "+" is a string operator, too 
alert ("5" == 5); // true 

Những gì bạn có thể muốn xem xét là sắc kiểm tra (===). Điều đó đảm bảo các biến là giống hệt nhau, không chỉ đơn thuần là bằng.

alert("5" == 5); // true, these are equal 
alert("5" === 5); // false, these are not identical. 

Ngoài ra, hãy xem câu hỏi này: How do the equality and identity comparison operators differ? Việc triển khai PHP rất giống với javascript.

1

Javascript là một ngôn ngữ được nhập lỏng lẻo, vì vậy các dự đoán được thực hiện vào thời gian chạy bất cứ khi nào người phiên dịch cảm thấy cần thiết. Nếu bạn so sánh một số nguyên với một chuỗi, nó chỉ ra rằng chúng phải là cùng một loại, vì vậy, ví dụ, "34" == 34 là đúng, vì số nguyên có lẽ sẽ được nhập vào chuỗi trước khi so sánh.

Chuỗi "false" không được nhập vào bool, thay vào đó bool false được nhập vào chuỗi, nó sẽ có giá trị "0", nghĩa là một chuỗi chứa số 0, cho "0 "==" sai ", hiển nhiên là sai.

Nếu bạn muốn so sánh các giá trị mà không typecasting tự động, so sánh hiệu quả các loại cũng như giá trị, sử dụng một triple bằng:

5 === "5" false "chuỗi" === "chuỗi" đúng

4

JavaScript có hai bộ điều hành bình đẳng:

  • === and !== (khai thác bình đẳng nghiêm ngặt)
  • == and != (nhà điều hành bình đẳng tiêu chuẩn s)

Các nhà khai thác bình đẳng tiêu chuẩn sẽ làm việc so sánh đúng nếu cả hai toán hạng là cùng loại, nhưng bạn có thể nhận được một số kết quả bất ngờ nếu họ không cùng loại, ví dụ:

'' == '0' // false 
0 == '' // true 
0 == '0' // true 
false == 'false' // false 
false == '0' // true 
false == undefined // false 
false == null // false 
null == undefined // true 
' \t\r\n ' == 0 // true 

Đối với điều đó tôi luôn khuyên bạn nên sử dụng các toán tử bình đẳng nghiêm ngặt (===,! ==).

1

Tại sao nó như vậy?

Vì JavaScript vừa được nhập sai và cực kỳ không nhất quán. Không phải tất cả các tính năng thiết kế của nó đều được suy nghĩ cẩn thận; nó được tạo ra, triển khai và triển khai cực kỳ nhanh chóng so với bất kỳ ngôn ngữ lập trình nào khác, trong một cuộc chạy đua để có được Netscape 2.0. Không lâu sau đó nó ổn định, mất đi một số lỗi nghiêm trọng hơn và trở thành nửa tiêu chuẩn hóa.

Tìm kiếm một số loại lý do triết học cho những thứ như quy tắc đúc loại tiềm ẩn có thể là một bài tập không kết quả. JavaScript nguyên tắc thực sự nhất quán tuân thủ là DWIM, rất nhiều trong ý nghĩa tiêu cực.

0

JavaScript xác định giá trị falsey là 0, boolean false và undefined. Bất kỳ chuỗi nào bên ngoài "0" đều đúng, ngay cả khi chuỗi đó là 'sai'.

Loại gây phiền nhiễu, thực sự.

Các vấn đề liên quan