2016-06-23 15 views
6

Tôi đọc trong 'JavaScript chuyên nghiệp cho nhà phát triển Web' bởi Nicholas Zakas trong p.78 của 3rd edition (người cuối cùng tôi nghĩ):Chuyển tuyên bố và kiểu ép buộc

Lệnh switch so sánh giá trị sử dụng hệt bằng toán tử, do đó không có sự ép buộc kiểu nào xảy ra (ví dụ chuỗi "10" là không bằng số 10).

tôi tạo thành một số câu lệnh switch đơn giản chỉ để xác nhận và kết quả là khác nhau:

var num = "9"; 

switch (true) { 
    case num < 0: 
     alert("less than 0"); 
     break; 

    case num >= 0 && num <10: 
     alert("between 0 and 10"); 
     break; 

    default: 
     alert("False"); 

} 

https://jsfiddle.net/pbxyvjyf/

Vì vậy, loại ép buộc được thực hiện: các alert("between 0 and 10") được chọn. Có các quy tắc thay đổi hay tôi đang làm điều gì sai?

Trả lời

6

Điều này sẽ return false:

var num = "9"; 

switch (num) { 
    case num < 0: 
    alert("less than 0"); 
    break; 

    case num >= 0 && num <10: 
    alert("between 0 and 10"); 
    break; 

    default: 
    alert("False"); 

} 

Vì vậy, tác giả là chính xác.

+1

Cảm ơn bạn :) Bây giờ tôi hiểu những gì tôi đã làm sai. Trong thực tế, ngay cả trong ví dụ tôi đã cho tác giả là chính xác: \t chữ số "= 0 && num <10: '(ví dụ của tôi) là một chuỗi, vì vậy chuyển thành 0 vì sai và sau đó là' cảnh báo ("từ 0 đến 10"); ' xuất hiện. Cảm ơn bạn! – viery365

+2

Vấn đề là bạn về cơ bản so sánh '" 9 "' với 'true' và' false'. Các biểu thức ('num < 0', 'num > = 0 && num <10') được đánh giá trước khi so sánh trường hợp được thực hiện. –

+0

@MikeC chính xác là cách bạn nói! Bây giờ tôi hiểu rồi. Cảm ơn bạn đã làm cho tôi hiểu những gì tôi đã làm sai. – viery365

8

trường hợp báo cáo của bạn trả về một boolean để loại là đúng

num >= 0 && num <10 - trả về true hoặc false

nhưng nếu tôi sẽ làm điều này

switch (1) { 
 
    case "1": 
 
     console.log("never get here"); 
 
     break; 
 

 
    case 1: 
 
     console.log("but this works"); 
 
     break; 
 

 
}

+0

Cảm ơn bạn rất nhiều! Tôi chắc chắn tôi đã làm điều gì đó sai trái và tôi vui vì bạn đã sửa chữa tôi. – viery365

+0

không có vấn đề, vui mừng tôi có thể giúp :) – WalksAway

3

Bạn thực sự không sử dụng câu lệnh chuyển đổi như dự định. Nên có một biểu thức được đánh giá trong chuyển đổi và các trường hợp kiểm tra các giá trị có thể có. Đây là một trong các ví dụ kinh điển:

switch (new Date().getDay()) { 
    case 0: 
        day = "Sunday"; 
        break; 
    case 1: 
        day = "Monday"; 
        break; 
    case 2: 
        day = "Tuesday"; 
        break; 
    case 3: 
        day = "Wednesday"; 
        break; 
    case 4: 
        day = "Thursday"; 
        break; 
    case 5: 
        day = "Friday"; 
        break; 
    case 6: 
        day = "Saturday"; 
} 

Bạn đang sử dụng câu lệnh chuyển đổi giống như một nhóm if.

+0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn! – viery365

3

Dòng đó từ tài liệu có nghĩa là không có cưỡng chế loại được sử dụng để so sánh giá trị switch cho mỗi giá trị case.

Nếu biểu hiện case chính nó là một biểu thức liên quan đến việc ép buộc loại, thì rõ ràng sẽ có sự ép buộc loại đang diễn ra. num >= 0 && num <10 đánh giá là true, nhưng động cơ sẽ sử dụng "toán tử giống hệt nhau" trong so sánh số true với số true ở đầu câu lệnh switch. Vì true giống hệt với true, luồng điều khiển đi vào đó case.

+0

Cảm ơn bạn rất nhiều vì câu trả lời của bạn! Bây giờ tôi hiểu và tôi sẽ không phạm sai lầm lần nữa :) – viery365

1

Không một chuyên gia của javascript nhưng tôi nghĩ rằng các quy tắc mà tác giả đề cập có giá trị trong trường hợp này, ví dụ:

var num = "9"; 

    switch(num){ 

     case 9: 
      alert("Yes the number is equal to: 9"); 
      break; 
     default: 
      alert("False"); 

    } 

Nếu bạn cố gắng chạy mã này, bạn sẽ thấy rằng các cảnh báo thứ hai sẽ xuất hiện.

Hy vọng rằng tôi đã giúp bạn ..:)

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