2009-01-20 40 views
16

Tôi đã gỡ lỗi gì đó và phát hiện ra một số lạ trong JavaScript:Ngụ ý so sánh chuỗi, 0 = '', nhưng 1 = '1'

alert(1=='') ==> false 
alert(0=='') ==> true 
alert(-1=='') ==> false 

Nó sẽ làm cho cảm giác rằng một chuỗi so sánh ngụ ý rằng 0 nên = ' 0 '. Điều này đúng cho tất cả các giá trị khác không, nhưng tại sao không cho giá trị 0?

Trả lời

18

Theo tài liệu Mozilla trên Javascript Comparison Operators

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

gì thực sự xảy ra là các dây đang được chuyển đổi sang số. Ví dụ:

1 == '1' trở thành 1 == Number('1') trở thành 1 == 1: true

Sau đó, hãy thử điều này: 1 == '1.' trở thành 1 == Number('1.') trở thành 1 == 1: true Nếu họ đã trở thành chuỗi, sau đó bạn sẽ nhận được '1' == '1.', đó sẽ là sai .

Nó chỉ như vậy sẽ xảy ra rằng Number('') == 0, do đó 0 == '' là đúng

2

Javascript, như PHP, được nhập sai *. Vì vậy, khi bạn so sánh 0 đến '', công cụ JS chuyển đổi chúng thành một kiểu dữ liệu tương tự. Vì 0 và '' đều tương đương với boolean (false), "false == false" là đúng.

* Ngôn ngữ gõ nhẹ không yêu cầu biến là bất kỳ loại dữ liệu cụ thể nào, vì vậy bạn có thể đặt một biến làm chuỗi, thay đổi thành int, float và quay lại chuỗi mà không có lỗi xử lý.

+0

1 rất đẹp - bạn có biết cách động cơ quyết định mà datatype để chuyển đổi? Rõ ràng chuyển đổi 0 thành một chuỗi sẽ không có kết quả tương tự. –

+0

Điều này sai - '' sẽ được chuyển thành 0, không phải là boolean 'false' – Christoph

+0

Không, tôi không chắc chắn. Tôi sẽ nghi ngờ rằng đó là một loại số, hoặc một diễn viên boolean. – davethegr8

3

Đây chỉ là một trong những cây xoài thật sự ghê gớm đi vào sự thỏa hiệp JavaScript. '' và 0 là cả hai giá trị uninitialized (bằng boolean false) và, do đó, bằng nhau.

Để bảo vệ bạn khỏi các lỗi lạ như thế này, tốt hơn là luôn sử dụng toán tử ===.

+0

0 và '' không phải là giá trị chưa được khởi tạo . Chúng là các giá trị được chuyển đổi hoàn toàn thành cùng một giá trị khi so sánh. –

10

Khi javascript thực hiện chuyển đổi loại tiềm ẩn, chuỗi ký tự trống sẽ khớp với 0 số nguyên. So sánh như thế này và bạn sẽ nhận được kết quả mong đợi của mình:

alert(1==='') ==> false 
alert(0==='') ==> false 
alert(-1==='') ==> false 
+0

+1 vì câu trả lời này thực sự là một giải pháp! – NLemay

2

Trong nhiều ngôn ngữ, chuỗi rỗng có thể bị ép buộc là sai.

Hãy coi chừng làm so sánh với == thay vì ===:

alert('' == '0'); //false 
alert(0 == ''); // true 
alert(0 =='0'); // true 

== không bắc cầu.

4

ECMA-262, 3rd edition, 11.9.3 về x == y, bước 16:

Nếu Type (x) là số lượng và loại (y) là String, trả lại kết quả của việc so sánh x == ToNumber (y).

Chuỗi rỗng '' được chuyển đổi thành 0 trước khi so sánh.

+1

+1 nhưng làm cho các thông số trích dẫn một liên kết sẽ được tốt đẹp – Greg

+0

@RoBorg: liên kết không hoạt động với PDF, và googling ECMA-262 và nhấp vào liên kết đầu tiên không phải là nhiều bất tiện .. – Christoph

+0

@Christoph không phải là googling cho "nhà điều hành bình đẳng javascript" nhưng đó không phải là điểm – Greg

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