Một câu lệnh switch
có thể thay thế nhiều câu lệnh if
Nó đưa ra một cách mô tả dễ hiểu hơn để so sánh một giá trị với nhiều biến thể.
Nội dung chính
1. Cú pháp
switch
có một hoặc nhiều khối case
và một tùy chọn default.
Nó trông như thế này:
switch(x) {
case 'value1': // if (x === 'value1')
...
[break]
case 'value2': // if (x === 'value2')
...
[break]
default:
...
[break]
}
- Giá trị của
x
được kiểm tra ứng với giá trị từ giá trịcase
thứ nhất (nghĩa làvalue1
) sau đó đến giá trị thứ haicase
(value2
), v.v. - Nếu tìm thấy giá trị giống,
switch
bắt đầu thực thi code tương ứng củacase
đó, cho đến khi gặpbreak
gần nhất (hoặc cho đến khi kết thúcswitch
). - Nếu không có trường hợp nào khớp thì code
default
được thực thi (nếu nó tồn tại).
2. Một ví dụ
Một ví dụ về switch
:
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
break;
case 4:
alert( 'Exactly!' );
break;
case 5:
alert( 'Too large' );
break;
default:
alert( "I don't know such values" );
}
Ở đây switch
bắt đầu để so sánh a
từ các case
biến thể đầu tiên đó là 3
. Nhưng không giống.
Sau đó 4
. Giống với a, vì vậy việc thực hiện bắt đầu từ case 4
cho tới khi gần nhất break
.
Nếu không có break
thì việc thực thi tiếp tục với case
tiếp theo mà không có bất kỳ kiểm tra nào.
Một ví dụ không có break
:
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
case 4:
alert( 'Exactly!' );
case 5:
alert( 'Too big' );
default:
alert( "I don't know such values" );
}
Trong ví dụ trên, chúng ta sẽ thấy thực hiện tuần tự ba alert
:
alert( 'Exactly!' );
alert( 'Too big' );
alert( "I don't know such values" );
Bất kỳ biểu thức có thể là đối số của một switch/case
Cả hai switch
và case
cho phép biểu thức tùy ý.
Ví dụ:
let a = "1";
let b = 0;
switch (+a) {
case b + 1:
alert("this runs, because +a is 1, exactly equals b+1");
break;
default:
alert("this doesn't run");
}
Ở đây +a
đưa ra 1
, đó là so sánh với b + 1
trong case
và code tương ứng được thực thi.
3. Phân nhóm các trường hợp
Một số biến thể trong case
đó chia sẻ cùng một code có thể được nhóm lại.
Ví dụ: nếu chúng ta muốn cùng một code chạy case 3
và case 5
:
let a = 3;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) grouped two cases
case 5:
alert('Wrong!');
alert("Why don't you take a math class?");
break;
default:
alert('The result is strange. Really.');
}
Bây giờ cả hai 3
và 5
hiển thị cùng một thông điệp.
Khả năng xử lý các trường hợp nhóm là một tác dụng phụ của cách thứcswitch/case
hoạt động mà không có break
. Ở đây việc thực hiện case 3
bắt đầu từ dòng (*)
và đi qua case 5
, bởi vì không có break
.
4. Kiểu dữ liệu của đối số kiểm tra trong Switch
Việc kiểm tra bằng luôn luôn nghiêm ngặt. Các giá trị phải cùng kiểu để kiểm tra.
Ví dụ: hãy xem xét code sau:
let arg = prompt("Enter a value?");
switch (arg) {
case '0':
case '1':
alert( 'One or zero' );
break;
case '2':
alert( 'Two' );
break;
case 3:
alert( 'Never executes!' );
break;
default:
alert( 'An unknown value' );
}
- Đối với
0
,1
thìalert
đầu tiên sẽ chạy. - Đối với
2
,alert
thứ hai sẽ chạy. - Nhưng đối với
3
, kết quả củaprompt
một chuỗi"3"
, không hoàn toàn bằng===
số3
. Vì vậy, chúng ta sẽ không chạycase 3
và biến thểdefault
sẽ thực hiện.