Menu

Câu lệnh switch trong JavaScript: case, break và fallthrough

Câu lệnh switch trong JavaScript hoạt động thế nào: case, break, default, fallthrough, và khi nào switch tốt hơn một chuỗi if/else.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Switch chọn một nhánh trong nhiều nhánh

switch là câu lệnh điều khiển luồng dành cho lúc bạn so sánh một giá trị với một vài lựa chọn đã biết. Một chuỗi if/else if/else cũng làm được việc này, nhưng khi bạn kiểm tra cùng một biến ba, bốn lần liên tiếp, switch dễ đọc hơn.

Hình dạng cơ bản:

Đọc từ trên xuống: JavaScript tính giá trị day, so sánh nó với từng nhãn case và chạy khối lệnh khớp. default bắt mọi thứ không khớp, giống else cuối cùng. Thứ tự đọc là giá trị → case → code.

Việc so khớp thực sự diễn ra thế nào

switch so sánh bằng so sánh nghiêm ngặt, tức toán tử ===. Không ép kiểu, không so khớp gần đúng. case 1: sẽ khớp với số 1 nhưng không khớp với chuỗi "1".

Chỉ case thứ hai khớp. Nếu có lúc bạn ngạc nhiên vì switch không chạy vào case nào, thủ phạm thường là chuỗi lệch với số, đến từ ô nhập liệu của form hoặc tham số URL.

break là thứ dừng luồng chạy

Đây là phần hay làm người học vấp. Một nhãn case là điểm nhảy tới, không phải một khối lệnh khép kín. Khi luồng chạy đã đáp xuống một case khớp, nó tiếp tục chạy từng dòng, đi xuyên qua nhãn của case kế tiếp, cho tới khi gặp break, return hoặc hết switch.

Xem điều gì xảy ra khi không có break:

Chỗ khớp là "editor", nhưng bạn vẫn nhận được can edit, can view và logged in. Đó là fallthrough: luồng chạy rơi qua từng case phía sau vì không có gì bảo nó dừng.

Thêm break vào là nó chạy đúng:

Thói quen nên có: mọi case kết thúc bằng break, trừ khi bạn thực sự muốn fallthrough.

Cố ý fallthrough để gom nhóm

Fallthrough không phải lúc nào cũng là lỗi. Bỏ break là cách gọn gàng để nói "các case này đều làm cùng một việc":

Các nhãn case rỗng xếp chồng lên nhau dùng chung khối lệnh bên dưới. Để ý rằng không cần break sau return: hàm thoát hẳn. return bên trong switch bỏ qua mọi thứ lẽ ra sẽ chạy tiếp theo.

Khi bạn thực sự muốn fallthrough giữa các case không rỗng, hãy để lại một chú thích để người đọc sau không "sửa" nó:

default không bắt buộc phải đứng cuối

Theo quy ước, default nằm ở dưới cùng, và đó là chỗ phần lớn người đọc mong thấy nó. Nhưng về mặt kỹ thuật, nó chỉ là một nhãn khác: nó khớp khi không có case nào khớp, dù nằm ở đâu. Nếu đặt default ở giữa mà không có break, nó sẽ rơi xuống bất cứ thứ gì bên dưới. Hãy đặt nó cuối cùng, kết thúc bằng break (hoặc không, vì phía sau chẳng còn gì), và bạn của sau này sẽ cảm ơn bạn.

Phạm vi biến bên trong case

Các case dùng chung một phạm vi khối, là toàn bộ switch. Khai báo let hoặc const cùng tên ở hai case sẽ ném lỗi khai báo lại:

switch (x) {
    case 1:
        let msg = "one";
        break;
    case 2:
        let msg = "two";   // SyntaxError: Identifier 'msg' has already been declared
        break;
}

Cách sửa là mỗi case một khối lệnh: bọc thân case trong { }:

Giờ mỗi msg nằm trong phạm vi riêng và xung đột biến mất. Điều này đáng nhớ mỗi khi một case cần nhiều hơn một, hai dòng logic.

switch và if/else

switch tỏa sáng khi bạn kiểm tra một giá trị với nhiều lựa chọn cố định: mã HTTP, loại action của Redux, tên lệnh, chuỗi kiểu enum. Giá trị chỉ xuất hiện một lần ở trên cùng, và mắt người đọc lướt qua các nhãn case như đọc mục lục.

if/else tốt hơn khi:

  • Bạn so sánh theo khoảng (score >= 90, score >= 75).
  • Các điều kiện liên quan tới nhiều biến khác nhau hoặc biểu thức boolean.
  • Bạn muốn so sánh lỏng hoặc so sánh theo cách riêng (switch luôn là ===).

Một cách thay thế phổ biến hiện nay cho mẫu đầu tiên là tra cứu qua đối tượng:

Ba dòng thay cho một switch chín dòng. Khi các case chỉ là ánh xạ dữ liệu thuần, không có logic thật, một đối tượng (hoặc Map) thường dễ đọc hơn. Hãy dùng switch khi mỗi case thực sự phải làm việc.

Tiếp theo: vòng lặp for

switch xử lý một quyết định giữa nhiều lựa chọn. Phần tiếp theo của điều khiển luồng là lặp lại: chạy cùng một khối lệnh nhiều lần. Đó là việc của vòng lặp for, ngay sau đây.

Câu hỏi thường gặp

Câu lệnh switch hoạt động thế nào trong JavaScript?

switch so sánh một giá trị với một loạt nhãn case bằng so sánh nghiêm ngặt (===). Khi tìm thấy chỗ khớp, nó chạy code của case đó và tiếp tục chạy cho tới khi gặp break hoặc hết khối lệnh. Mệnh đề default (không bắt buộc) chạy khi không có case nào khớp.

Fallthrough trong switch của JavaScript là gì?

Nếu một case không kết thúc bằng break (hoặc return), code tiếp tục rơi xuống phần code của case kế tiếp, dù nhãn của case đó không khớp. Điều này đôi khi hữu ích để gom các case dùng chung logic, nhưng thường gặp hơn là bug. Luôn kết thúc case bằng break, trừ khi bạn cố ý muốn fallthrough.

Khi nào nên dùng switch thay cho if/else trong JavaScript?

Dùng switch khi bạn so sánh một giá trị với nhiều lựa chọn cố định: mã trạng thái HTTP, loại action, lệnh dạng chuỗi. Dùng if/else khi bạn cần so sánh theo khoảng, nhiều biến hoặc biểu thức boolean. Nhớ rằng switch dùng so sánh nghiêm ngặt, nên case '1' sẽ không khớp với số 1.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu