F8

FULLSTACK HUB

JavaScript 2 tháng 7, 2026 lúc 18:33

Câu điều kiện, vòng lặp trong JavaScript, String, Number

PHẦN 1: TƯ DUY CỐT LÕI (BÀI 15)

1. if / else if / else — "Trạm gác phân luồng"

Đây là công cụ giúp website của bạn biết "động não" thay vì chỉ hiển thị tĩnh.

  • Bản chất: Nó giống như một loạt các trạm thu phí đặt nối tiếp nhau trên đường cao tốc. Xe (dữ liệu) chạy từ trên xuống dưới. Nếu thỏa mãn điều kiện ở trạm nào, nó sẽ chui vào trạm đó xử lý, và BỎ QUA TOÀN BỘ các trạm bên dưới.

  • Tư duy Growth Engineer: Bạn làm A/B Testing. Khách vào Landing Page.

    • if (đến từ Facebook Ads) ➔ Hiện tiêu đề giảm giá 50%.

    • else if (đến từ Google SEO) ➔ Hiện tiêu đề tư vấn chuyên sâu.

    • else (khách vãng lai) ➔ Hiện tiêu đề mặc định.

licensed image

Lưu ý sinh tử: Thứ tự ưu tiên là tất cả. Trạm gác nào gắt gao nhất, hẹp nhất phải đặt lên đầu. Nếu bạn đặt trạm kiểm tra "Là con người" lên trước trạm kiểm tra "Là đàn ông", thì khi một người đàn ông đi qua, hệ thống chỉ báo "Đây là con người" rồi dừng lại luôn.

if (Điều_kiện_1) {
    // Hành động A (Chỉ chạy nếu Điều_kiện_1 là ĐÚNG)
} else if (Điều_kiện_2) {
    // Hành động B (Chỉ chạy nếu Điều_kiện_1 SAI và Điều_kiện_2 ĐÚNG)
} else {
    // Hành động C (Phương án dự phòng cuối cùng, chạy khi TẤT CẢ các thằng trên đều SAI)
}

💡 Ứng dụng CRO thực tế trên Website:

Bạn muốn viết một đoạn script tối ưu tỷ lệ chuyển đổi: Nếu khách vào từ Facebook Ads (có tham số ?utm=fb), hãy hiện nút mua màu xanh. Nếu vào từ Google Ads (?utm=gg), hiện nút màu vàng. Khách vào tự nhiên (SEO), hiện nút mặc định.

let utmSource = "fb"; // Giả sử AI cào được tham số từ URL về là "fb"

if (utmSource === "fb") { console.log("Hiện nút mua màu XANH - Giảm giá 10% cho dân Facebook"); } else if (utmSource === "gg") { console.log("Hiện nút mua màu VÀNG - Tặng kèm quà cho dân Google"); } else { console.log("Hiện nút mua mặc định"); }

Cơ chế chạy: Máy thấy utmSource === "fb" đúng đét ngay dòng đầu ➔ In ra nút màu xanh ➔ Thoát hoàn toàn khỏi cụm if/else, không thèm ngó ngàng gì tới nhánh "gg" hay "mặc định" nữa.

Ghi chú sống còn cho ghi chú của bạn: Thứ tự ưu tiên cực kỳ quan trọng. Cái gì ngặt nghèo nhất, cần lọc trước nhất thì phải đưa lên đầu if. Nếu đưa sai thứ tự, code sẽ bắt sai bệnh.

2. Vòng lặp for — "Cỗ máy nhân bản vô tri"

Máy tính sinh ra là để làm những việc lặp đi lặp lại không biết mệt.

  • Bản chất: Thay vì copy/paste 100 dòng code, bạn viết 1 dòng và bảo máy tính: "Ê, chạy cái này 100 lần cho tao".

  • Cấu trúc 3 bước của for: for (1. Khởi động ; 2. Điều kiện chạy ; 3. Bước nhảy)

    • Khởi động: let i = 0 (Bắt đầu đếm từ 0).

    • Điều kiện: i < 100 (Chừng nào chưa tới 100 thì vẫn làm).

    • Bước nhảy: i++ (Làm xong 1 lần thì tăng bộ đếm lên 1).

  • Tư duy Growth Engineer: Bạn có mảng danh sách 10.000 email khách hàng. Bạn dùng vòng lặp for bốc từng email ra, gắn vào API của Mailchimp để gửi chiến dịch tự động.

3. Toán Tử Logic — Bộ Lọc Điều Kiện Phức Tạp

Để viết được các điều kiện if xịn, bạn cần các toán tử để gộp nhiều điều kiện lại với nhau.

Toán tửTên gọiÝ nghĩa thực tếVí dụ code
&&VÀ (AND)TẤT CẢ phải đúng thì mới chịu. Chỉ cần 1 thằng sai là tạch hết.(tuoi >= 18 && coTien === true) ➔ Phải vừa đủ tuổi vừa có tiền thì mới cho mua hàng.
||HOẶC (OR)CHỈ CẦN 1 THẰNG ĐÚNG là duyệt luôn. Ba phải, sao cũng được.(utm === "fb" || utm === "gg") ➔ Vào từ Facebook hay Google gì cũng đều là khách trả phí.
!PHỦ ĐỊNH (NOT)Đảo ngược tình thế. Đúng thành Sai, Sai thành Đúng.!isPremium ➔ Nếu KHÔNG PHẢI là tài khoản VIP (thì bắt xem quảng cáo).
🧠 Tư duy "Ép kiểu" (Truthy & Falsy) trong câu lệnh If:

Trong JavaScript, khi bạn nhét một cái gì đó vào ngoặc đơn của if (...), nó sẽ ép cái đó về dạng Đúng/Sai. Bạn bắt buộc phải ghi nhớ 6 thằng tội đồ luôn bị coi là SAI (Falsy):

  1. false

  2. 0 (Số không)

  3. "" (Chuỗi rỗng)

  4. null

  5. undefined
  6. NaN (Lỗi toán học)​

Cứ né 6 thằng này ra, thì tất cả những thứ khác (chuỗi có chữ, số lớn hơn 0, Object, Mảng...) đều được coi là ĐÚNG (Truthy).

Đây chính là lý do tại sao ở bài trước, câu lệnh if (acc[curr]) nó chạy được. Vì nếu acc[curr] trả về một con số (Ví dụ: 1), máy hiểu là true (đã có từ). Nếu trả về undefined, máy hiểu là false (chưa có từ).

4. Vòng Lặp For — Máy Tự Động Hóa Vô Tri

Vòng lặp sinh ra để giải quyết nỗi đau phải copy/paste code lặp đi lặp lại. Nó hoạt động như một cái máy chạy bộ: Bạn cài đặt số vòng, máy cứ thế dập khuôn chạy cho đến khi hết số vòng thì dừng.

Cấu trúc cơ học của một vòng lặp for cơ bản:
for (khởi_tạo_biến_đếm; điều_kiện_dừng; bước_nhảy) {
    // Khối code sẽ bị ép chạy lặp đi lặp lại
}

Tua chậm luồng chạy dưới RAM (Micro-Step):

Hãy xem đoạn code in ra các số từ 1 đến 3:

for (let i = 1; i <= 3; i++) {
    console.log("Vòng thứ:", i);
}

Dưới bộ nhớ, máy tính sẽ chạy chính xác theo các bước kiểm tra sau:

  • Bước khởi đầu: Máy tạo ra một biến i = 1. (Chỉ làm bước này duy nhất một lần đầu).

  • Vòng lặp 1:

    • Máy kiểm tra điều kiện: i <= 3 (tức là 1 <= 3). ĐÚNG!

    • Vì đúng, máy chui vào trong chạy lệnh console.log ➔ In ra: Vòng thứ: 1.

    • Chạy xong code bên trong, máy nhảy lên đuôi gọi lệnh bước nhảy i++ (tăng i lên 1 đơn vị) ➔ Lúc này i biến thành 2.

  • Vòng lặp 2:

    • Máy kiểm tra lại điều kiện: i <= 3 (tức là 2 <= 3). ĐÚNG!

    • Chui vào trong chạy lệnh ➔ In ra: Vòng thứ: 2.

    • Nhảy lên đuôi chạy i++ ➔ Lúc này i biến thành 3.

  • Vòng lặp 3:
    • Kiểm tra điều kiện: i <= 3 (tức là 3 <= 3). Vẫn ĐÚNG!

    • Chui vào trong chạy lệnh ➔ In ra: Vòng thứ: 3.

    • Nhảy lên đuôi chạy i++ ➔ Lúc này i biến thành 4.

  • Vòng kết thúc:

    • Kiểm tra điều kiện: i <= 3 (tức là 4 <= 3). SAI RỒI!

    • Máy lập tức phá vỡ vòng lặp, tắt máy, đi ra ngoài chạy tiếp các đoạn code phía dưới.

💡 Ứng dụng SEO thực tế:

Bạn có một mảng chứa 3 cái URL bài viết lỗi cần phải chuyển hướng (Redirect 301). Bạn muốn dùng vòng lặp để tự động xử lý từng URL một mà không cần viết 3 dòng code trùng lặp.

const errorUrls = ["/baiviet-cu-1", "/baiviet-cu-2", "/baiviet-cu-3"];

// errorUrls.length bằng 3. Vòng lặp sẽ chạy i từ 0, 1, đến 2. for (let i = 0; i < errorUrls.length; i++) { console.log("Đang cấu hình Redirect 301 cho trang:", errorUrls[i]); }

📝 Tóm tắt Cheat-sheet để bạn lưu Note nhanh:

  1. if/else chạy từ trên xuống, đụng thằng nào true đầu tiên là chộp lấy thằng đó và kết thúc luôn toàn bộ cụm điều kiện.
  2. Bản chất của các hàm cao cấp như map, filter, reduce thực chất chỉ là người ta viết sẵn một cái vòng lặp for chạy ngầm bên dưới để quét qua mảng dữ liệu cho bạn đỡ phải tự gõ for (let i = 0...) mà thôi.

Đọc kỹ mớ note này, bạn đã hình dung ra được cỗ máy máy tính nó rẽ nhánh và đếm số bước vô tri như thế nào chưa? Nếu đầu óc đã thông suốt và bớt rối loạn, chúng ta sẽ bắt đầu áp dụng Quy trình 4 bước (Viết tiếng Việt trước, code sau) vào giải quyết Bài tập 1 - Phân loại tam giác nhé!




1. Toán tử ba ngôi (Ternary Operator ? :) - Câu 9

Thay vì viết một cụm if/else dài tới 5 dòng chỉ để gán một cái giá trị, toán tử ba ngôi giúp bạn nén lại trên đúng một dòng duy nhất.

Cấu trúc cơ học:

$$Biến = Điều_kiện ? Giá_trị_nếu_ĐÚNG : Giá_trị_nếu_SAI;$$

💡 Ứng dụng CRO / A/B Testing thực tế:

Thay đổi tiêu đề hoặc nút kêu gọi hành động (CTA) dựa trên thiết bị của người dùng để tăng tỷ lệ click.

let isMobile = true; // Thiết bị của khách là điện thoại

// Viết kiểu đồ cổ If/Else: let ctaText; if (isMobile) { ctaText = "Gọi ngay"; } else { ctaText = "Xem chi tiết"; }

// Viết kiểu Pro bằng Toán tử ba ngôi: let ctaTextPro = isMobile ? "Gọi ngay" : "Xem chi tiết"; console.log(ctaTextPro); // In ra: "Gọi ngay"

Cơ chế dưới RAM: Máy tính đánh giá cụm isMobile. Nếu ra true, nó lấy ngay giá trị sau dấu ? gán thẳng vào biến và vứt bỏ phần sau dấu : ra khỏi bộ nhớ.

2. Sự phân biệt khắc nghiệt: =====​ - Cạm bẫy ép dữ liệu

Đây là cú lừa kinh điển nhất trong JavaScript khiến nhiều đoạn mã tracking bị chết đứng mà không hề báo lỗi.

Toán tửTên gọiCơ chế chạy ngầm dưới bộ nhớVí dụ thực tế
==So sánh tương đốiMáy tự động ép kiểu dữ liệu của hai bên về cùng một dạng rồi mới so sánh.'5' == 5true (Vì máy tự biến chuỗi '5' thành số 5).
===So sánh nghiêm ngặtMáy giữ nguyên trạng thái, so sánh cả Giá trị lẫn Kiểu dữ liệu.'5' === 5false (Vì một bên là Chuỗi, một bên là Số).

💡 Cạm bẫy thực tế khi làm Web:

Khi bạn cào số trang từ URL (ví dụ: ?page=2) để làm chức năng phân trang hoặc tracking, giá trị lấy ra luôn luôn ở dạng Chuỗi ("2").

let currentPage = "2"; // Dữ liệu lấy từ URL thanh địa chỉ luôn là String

if (currentPage === 2) { console.log("Kích hoạt mã theo dõi trang số 2"); // TẠCH! Dòng này không bao giờ chạy vì "2" (String) khác 2 (Number) }

if (currentPage == 2) { console.log("Mã theo dõi chạy thành công!"); // Chạy đúng nhờ cơ chế ép kiểu tương đối }

🚨 Ghi chú sống còn: Để code luôn an toàn và sạch sẽ, đi làm thực tế người ta mặc định 100% xài ===. Nếu biết dữ liệu từ URL là chuỗi, hãy tự ép kiểu nó về số trước bằng hàm Number() rồi mới đem đi so sánh nghiêm ngặt.

3. Vị cứu tinh của Web: Optional Chaining ?. & Nullish ?? (Câu 2, Câu 20)

Khi làm việc với các hệ thống theo dõi dữ liệu (DataLayer) của Google Tag Manager, dữ liệu đổ về từ người dùng rất phập phù. Nếu khách chưa đăng nhập, các trường dữ liệu như tên, email sẽ bị trống (null hoặc undefined).

Nếu bạn cố tình chọc thẳng vào một thuộc tính không tồn tại, JavaScript sẽ báo lỗi đỏ lòm và lập tức làm sập toàn bộ các đoạn script chạy phía sau nó.

🥊 Giải pháp cứu cánh:
  • ?. (Optional Chaining): Kiểm tra xem thằng đứng trước có tồn tại không. Nếu có thì đi tiếp, nếu không thì phanh gấp trả về undefined chứ không làm sập web.

  • ?? (Nullish Coalescing): Cung cấp giá trị dự phòng nếu dữ liệu bị null hoặc undefined.
// Trường hợp: Khách hàng vãng lai, hoàn toàn không đăng nhập tài khoản
const dataLayer = {
    cart: {
        totalPrice: 150000
    }
    // Thuộc tính "user" hoàn toàn không tồn tại trong Object này
};

// Viết kiểu liều mạng (SẬP WEB): // const email = dataLayer.user.email; // Lỗi ngay lập tức: "Cannot read properties of undefined"

// Viết kiểu an toàn tuyệt đối: const userEmail = dataLayer.user?.email ?? "guest@gmail.com"; console.log(userEmail); // In ra: "guest@gmail.com" mà trang web vẫn bình an vô sự!


4. Công Tắc Chuyển Mạch switch / case — Tránh Tổ Ong If/Else

Khi một biến có quá nhiều giá trị cụ thể cần rẽ nhánh (từ 4-5 trường hợp trở lên), việc viết if / else if liên tục sẽ khiến đoạn code trông cực kỳ rối mắt và khó bảo trì. switch / case ra đời để tạo thành một bảng mạch rõ ràng hơn.

Cú lừa "Tuột xích" (Fall-through) cần ghi nhớ:

Thằng switch so sánh các trường hợp bằng toán tử nghiêm ngặt ===. Nhưng nó có một tính chất cơ học là: Nếu khớp một case, nó sẽ chạy code của case đó và chạy luôn toàn bộ code của các case nằm bên dưới nếu bạn không chèn chữ break để khóa chốt.

let pageType = "product"; // Loại trang hiện tại khách đang xem

switch (pageType) { case "home": console.log("Kích hoạt pixel Trang Chủ"); break; case "product": console.log("Kích hoạt pixel Trang Sản Phẩm"); // Máy khớp case này và chạy dòng này // Quên viết break ở đây! case "cart": console.log("Kích hoạt pixel Giỏ Hàng"); // Bị tuột xích! Dòng này vẫn bị chạy dù pageType không phải là cart break; default: console.log("Kích hoạt pixel mặc định"); }

5. Bộ phanh khẩn cấp: breakcontinue (Câu 6, Câu 12)

Hai lệnh này dùng để điều khiển nhịp độ của vòng lặp (for, while), giúp tối ưu hóa tài nguyên CPU của trình duyệt khi xử lý mảng dữ liệu lớn.

  • break: Đạp phanh đứng bánh! Hủy diệt và thoát khỏi vòng lặp ngay lập tức.

  • continue: Nhấn ga nhảy lượt! Bỏ qua toàn bộ những câu lệnh phía dưới của lượt này, lập tức nhảy sang vòng lặp kế tiếp.

💡 Ứng dụng Quét lỗi URL tự động:

Bạn viết một script chạy qua danh sách 1000 đường link để tìm xem có link nào bị dính lỗi 404 hay không.

const webLinks = ["/trang-chu", "/san-pham-loi-404", "/gio-hang", "/lien-he"];

for (let i = 0; i < webLinks.length; i++) { if (webLinks[i].includes("404")) { console.log("Phát hiện link lỗi tại vị trí:", i); break; // Tìm thấy phát là dừng máy luôn, không rảnh quét tiếp các link phía sau làm gì cho nặng web! } }

Thống Kê Liên Kết

Nội bộ
0
Liên kết ngoài
1
Liên Kết Ngoài