74

Tôi có một biến có thể là boolean false hoặc một số nguyên (bao gồm 0). Tôi muốn đặt nó trong một tuyên bố chuyển đổi như:Có an toàn để giả định so sánh chặt chẽ trong tuyên bố chuyển đổi JavaScript không?

switch(my_var){ 
    case 0: 
     // Do something 
     break; 
    case 1: 
     // Do something else 
     break; 
    case false: 
     // Some other code 
} 

Trong thử nghiệm của tôi trong Google Chrome, có vẻ như hoạt động hoàn hảo, nhưng tôi hơi lo lắng khi sử dụng vì tôi sợ rằng trong một số trình duyệt , nếu my_varfalse, nó có thể thực hiện trường hợp đầu tiên kể từ 0 == false.

Tôi chỉ tự hỏi nếu có bất kỳ điều gì chính thức trong JavaScript cho biết câu lệnh chuyển đổi sẽ sử dụng so sánh nghiêm ngặt như vậy 0 !== false, nhưng tôi không thể tìm thấy bất kỳ điều gì. các công cụ JavaScript khác nhau. Có ai biết nếu so sánh được thực hiện bởi một tuyên bố chuyển đổi được đảm bảo để được nghiêm ngặt?

Trả lời

71

Hãy xem ECMA 262, section 12.11, thuật toán thứ hai, 4.c.

c. Nếu đầu vào bằng clauseSelector theo quy định của các nhà điều hành ===, sau đó ...

+5

Đó là [tiệc tùng như thế kể từ năm 1999] (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition, % 20December% 201999.pdf) (trang 68, s. 12.11, CaseBlock # 3) – Walf

25

http://qfox.nl/notes/110 trả lời câu hỏi của bạn. (Anh chàng này biết rất nhiều về sự gớm ghiếc của JavaScript)

Chuyển đổi trong Javascript sử dụng kiểm tra loại nghiêm ngặt (===). Vì vậy, bạn không bao giờ phải lo lắng về việc ép buộc, ngăn cản một vài wtfjs :). Nếu trên bàn tay khác mà bạn đang tính vào sự ép buộc, may mắn vì bạn không thể buộc nó.

+0

https://jsfiddle.net/to469fLm/4/, bạn có thể tổng quát chức năng co giật để đạt được nhu cầu của bạn – darethas

33

Thử:

switch(1) { 
    case '1': 
    alert('Switch comparison is NOT strict.'); 
    break; 
    case 1: 
    alert('Switch comparison is strict.'); 
    break; 
    default: 
    alert('Huh?'); 
} 
+6

Sigh, tôi sẽ không bao giờ quen với downvotes. –

+15

Được rồi, lý do tôi nhận được nhược điểm là, để trả lời câu hỏi này, bạn sẽ cần thử nó trên mọi công cụ JavaScript có thể chạy ứng dụng JavaScript hoặc thư viện của bạn, có thể rất nhiều. Tuy nhiên, tôi là một fan hâm mộ lớn của thử nghiệm ngay cả chức năng cốt lõi. Không có vấn đề làm thế nào có thẩm quyền một mảnh tài liệu được, nó không thể thực sự đảm bảo tất cả các triển khai chính phù hợp, và cách nhất định để tìm ra là để kiểm tra. –

+1

Tôi đã bình chọn bình luận thứ hai của bạn, bởi vì bạn đúng - kiểm tra là quan trọng. Và với tư cách là nhà phát triển, tôi sẽ chịu trách nhiệm về mã để hoạt động trên một bộ trình duyệt nhất định — những người mà tôi biết đã được thử nghiệm. OTOH, nếu chúng ta không thể dựa vào tài liệu có thẩm quyền, điểm của stackoverflow.com là gì? (Và mặc dù nó không kiếm được sự tin tưởng của bạn, hy vọng rằng một sự thăng hoa nữa sẽ làm cho ngày của bạn trở lại.) (Bạn đã có một chút tin tưởng hơn tôi dù sao đi nữa.) –

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