Mọi chương trình đều cần phải phản hồi. Một người dùng nhấp vào một nút. Một API trả về dữ liệu. Một trường trong biểu mẫu bị xóa trống. Nếu không có cách để phân nhánh, mã của bạn sẽ chạy từng dòng một bất kể điều gì thực sự đang xảy ra. Các câu lệnh điều kiện mang lại cho JavaScript khả năng lựa chọn đó. Chúng là những người đưa ra quyết định bên trong các hàm của bạn, là những người gác cổng quyết định cái gì sẽ chạy và cái gì sẽ bị bỏ qua. Một khi bạn hiểu cách viết chúng thật tốt, bạn sẽ ngừng viết những kịch bản cứng nhắc và bắt đầu xây dựng những phần mềm thực sự có khả năng phản hồi.
Tại sao các câu lệnh điều kiện lại quan trọng
Luồng điều khiển (Control flow) là xương sống của logic. Bạn sử dụng câu lệnh điều kiện để xác thực mật khẩu trước khi gửi chúng lên máy chủ. Bạn kiểm tra xem giỏ hàng có trống hay không trước khi tính thuế. Bạn phát hiện xem một yêu cầu mạng có thất bại hay không để có thể hiển thị thông báo lỗi thay vì một màn hình trống. Tất cả các tình huống này đều dựa trên cùng một ý tưởng đơn giản: đánh giá một thứ gì đó, sau đó hành động tương ứng.
Nếu không có câu lệnh điều kiện, ứng dụng của bạn sẽ giống như một bài độc thoại thay vì một cuộc hội thoại. Nó không thể xử lý các tình huống dữ liệu khác nhau, quản lý lỗi một cách mượt mà, hoặc phản ứng với các hành động của người dùng theo bất kỳ cách có ý nghĩa nào. Chúng cho phép bạn kiểm soát cách chương trình chạy trong những tình huống không chắc chắn của thế giới thực.
Câu lệnh if cơ bản
Nơi đơn giản nhất để bắt đầu là câu lệnh if độc lập. Nó nói rằng, nếu điều này đúng, hãy thực hiện công việc này. Chỉ vậy thôi. Không có phương án dự phòng, không có đường dẫn thay thế.
if (x % 2 === 0) {
console.log("Even");
}
Trong đoạn mã này, toán tử chia lấy dư (modulus) kiểm tra xem x có chia hết cho hai hay không. Khi số dư bằng không, console sẽ ghi lại chuỗi ký tự. Nếu x là số lẻ, sẽ không có gì xảy ra. Khối lệnh sẽ bị bỏ qua và việc thực thi tiếp tục ở bên dưới.
Sự bỏ qua thầm lặng đó rất quan trọng. Đôi khi bạn chỉ muốn bảo vệ một hành động duy nhất. Có lẽ bạn muốn thêm một class CSS vào một nút chỉ khi nó đang hoạt động, hoặc thêm một phần tử vào một mảng chỉ khi đầu vào không trống. Một câu lệnh if đơn thuần sẽ xử lý những khoảnh khắc đó mà không buộc bạn phải viết những logic mà bạn không cần đến.
Thêm một lựa chọn thay thế với if-else
Các quyết định thực tế thường có hai mặt. Hoặc người dùng đã đủ tuổi, hoặc họ chưa đủ tuổi. Hoặc thanh toán đã thành công, hoặc nó thất bại. Cấu trúc if-else bao quát cả hai.
if (age >= 18) {
console.log("Adult");
} else {
console.log("Not an Adult");
}
Khối else sẽ bắt lấy tất cả những gì mà điều kiện đầu tiên đã từ chối. Nó tạo ra một nhánh nhị phân rõ ràng. Mô hình này hoạt động tốt cho các nút chuyển đổi (toggles), quyền hạn (permissions) và các cờ tính năng (feature flags). Hãy giữ cho logic bên trong mỗi khối được tập trung. Nếu bạn thấy mình đang xếp chồng quá nhiều tác vụ vào một nhánh, đó thường là dấu hiệu cho thấy bạn nên chia nhỏ công việc thành các hàm nhỏ hơn.
Kiểm tra nhiều nhánh với else if
Cuộc sống hiếm khi chỉ đưa ra hai lựa chọn. Bạn có thể cần phân loại một số là số dương, số âm hoặc số không. Bạn có thể chỉ định mức phí vận chuyển dựa trên các khoảng trọng lượng. Đối với các so sánh nhiều bước có thứ tự, hãy sử dụng else if.
if (x > 0) {
console.log("Positive");
} else if (x < 0) {
console.log("Negative");
} else {
console.log("Zero");
}
JavaScript đánh giá các điều kiện này từ trên xuống dưới. Ngay khi một điều kiện thỏa mãn, nó sẽ chạy khối lệnh đó và bỏ qua các phần còn lại. Thứ tự rất quan trọng. Nếu bạn kiểm tra x > 0 sau khi kiểm tra x > 100, thì kiểm tra nghiêm ngặt hơn sẽ không bao giờ được chạy vì kiểm tra lỏng lẻo hơn đã bắt được nó trước. Hãy coi else if như một danh sách ưu tiên.
Câu lệnh switch
Khi bạn so sánh một giá trị với nhiều tùy chọn riêng biệt, một chuỗi dài các câu lệnh else if có thể tạo cảm giác lặp đi lặp lại. Câu lệnh switch sẽ giúp làm gọn điều đó. Nó khớp một biểu thức với các mệnh đề case và chạy khối lệnh khớp đó.
switch (true) {
case marks >= 90:
Branch = "Computer science";
break;
case marks >= 80:
Branch = "Mechanical";
break;
default:
Branch = "Other";
}
Ví dụ này sử dụng switch(true) để đánh giá trực tiếp các điều kiện boolean, đây là một mô hình JavaScript phổ biến khi logic của bạn dựa trên các khoảng giá trị thay vì sự bằng nhau chính xác. Từ khóa break là thiết yếu. Nếu không có nó, việc thực thi sẽ trôi xuống trường hợp (case) tiếp theo bất kể nó có khớp hay không, điều mà hiếm khi là điều bạn muốn ở đây. Mệnh đề default hoạt động giống như một lệnh else cuối cùng, bắt lấy bất kỳ thứ gì không khớp với các trường hợp trước đó.
Switch tỏa sáng khi bạn có các tùy chọn rõ ràng, cố định. Nó thường dễ quét hơn so với một chồng các khối else if cao ngất, đặc biệt là khi mỗi nhánh chỉ đơn giản là gán một giá trị hoặc gọi một hàm duy nhất.
Toán tử ba ngôi
Đối với các quyết định nhị phân ngắn gọn, toán tử ba ngôi giúp mọi thứ trở nên gọn gàng. Nó nhận ba toán hạng: một điều kiện, một giá trị nếu đúng, và một giá trị nếu sai.
const result = (age >= 18) ? "Eligible" : "Not eligible";
Bạn có thể sử dụng nó để gán nhanh hoặc trả về giá trị ngay trên một dòng (inline returns). Nó hoạt động tốt khi kết quả là một biểu thức đơn giản. Hãy cưỡng lại sự thôi thúc lồng các toán tử ba ngôi sâu ba tầng. Một toán tử ba ngôi lồng nhau có thể tiết kiệm dòng code, nhưng nó làm giảm khả năng đọc. Khi logic của bạn phát triển, một khối if-else thường sẽ thân thiện hơn với lập trình viên tiếp theo khi họ mở tệp này.
Các quyết định lồng nhau
Logic phức tạp đôi khi đòi hỏi phải đặt thêm các câu hỏi tiếp nối. Bạn có thể lồng một câu lệnh if vào trong một câu lệnh if khác để tinh chỉnh quyết định.
if (weather === "sunny") {
if (temp > 30) {
console.log("
