Bài 6 — Vòng lặp: for, for...of và khi nào dùng loại nào
Bài 5 cho chương trình ra quyết định. Bài này cho nó khả năng lặp lại — thực thi một khối lệnh nhiều lần mà không viết lại thủ công. Đây là hiện thực của tư duy “khuôn mẫu lặp lại” nhắc ở Bài 1.
Trong automation, vòng lặp xuất hiện khi bạn cần xử lý một danh sách: kiểm tra từng sản phẩm trong giỏ hàng, chạy cùng một test với nhiều bộ dữ liệu, duyệt qua các dòng của một bảng.
Vòng lặp for cổ điển
for (let i = 0; i < 5; i++) {
console.log(`Lần lặp thứ ${i}`);
}Phần trong ( ) gồm ba thành phần, ngăn bởi dấu ;:
- Khởi tạo:
let i = 0— chạy một lần khi bắt đầu.ilà biến đếm. - Điều kiện:
i < 5— kiểm tra trước mỗi vòng. Còntruethì còn lặp. - Cập nhật:
i++— chạy sau mỗi vòng.i++nghĩa là tăngithêm 1.
Kết quả in ra i từ 0 đến 4 (năm lần). Lưu ý: lập trình đếm từ 0, nên i < 5 cho đúng 5 lần lặp với i = 0,1,2,3,4.
for…of: duyệt qua từng phần tử
Khi cần đi qua từng phần tử của một danh sách (array — học kỹ ở Bài 8), for...of gọn và rõ hơn nhiều:
const cacTrinhDuyet = ['chromium', 'firefox', 'webkit'];
for (const trinhDuyet of cacTrinhDuyet) {
console.log(`Chạy test trên ${trinhDuyet}`);
}Mỗi vòng lặp, biến trinhDuyet tự nhận giá trị của phần tử kế tiếp. Không cần biến đếm i, không lo sai chỉ số. Đây là lý do for...of được ưu tiên khi bạn chỉ cần nội dung các phần tử.
⚠️ Đừng nhầm
for...ofvớifor...in. Có một vòng lặp tên gần giống làfor...in, nhưng nó duyệt chỉ số/khóa (key) chứ không phải giá trị — và với mảng, chỉ số đó là chuỗi ('0','1',…), rất dễ gây bug. Quy tắc đơn giản: duyệt mảng thì luôn dùngfor...of(lấy giá trị). Chỉ dùngfor...inkhi thực sự muốn duyệt khóa của object (Bài 9), và ngay cả khi đó cũng có cách tốt hơn. Thấyfor...introng lúc search Google thì cẩn thận — dễ dùng nhầm.const arr = ['a', 'b', 'c']; for (const x of arr) console.log(x); // 'a', 'b', 'c' ← giá trị (đúng ý) for (const x in arr) console.log(x); // '0', '1', '2' ← chỉ số dạng chuỗi
Vòng lặp while
while lặp lại một khối lệnh chừng nào điều kiện còn true. Khác với for (thường dùng khi biết trước số lần), while hợp khi không biết trước bao nhiêu vòng — chỉ biết điều kiện dừng.
let i = 0;
while (i < 5) {
console.log(`Lần ${i}`);
i++; // BẮT BUỘC cập nhật, nếu không sẽ lặp vô hạn
}- Điều kiện được kiểm tra trước mỗi vòng. Sai ngay từ đầu thì khối lệnh không chạy lần nào.
- Bạn phải tự thay đổi điều kiện bên trong (ở đây là
i++), nếu không vòng lặp không bao giờ dừng.
while phù hợp cho tình huống kiểu “lặp cho tới khi đạt trạng thái mong muốn”. Nhưng cẩn thận: quên cập nhật điều kiện là nguyên nhân số một gây vòng lặp vô hạn.
Khi nào dùng loại nào
| Tình huống | Nên dùng |
|---|---|
| Cần chính bản thân các phần tử của danh sách | for...of |
| Cần chỉ số (index) hoặc điều khiển bước nhảy | for cổ điển |
| Lặp một số lần cố định không gắn với danh sách | for cổ điển |
| Lặp tới khi đạt điều kiện, không biết trước số vòng | while |
| Duyệt khóa của một object | for...in (Bài 9) |
Trong thực tế viết automation,
for...ofchiếm đa số vì bạn thường thao tác trên danh sách phần tử (locator). Chỉ dùngforcổ điển khi thực sự cần chỉ số hoặc bước nhảy đặc biệt. Ngoài ra còn các phương thức như.forEach,.map(Bài 8) cũng để duyệt — nhưng nắmfor...oftrước đã.
break và continue
Hai lệnh điều khiển luồng bên trong vòng lặp:
// break — thoát hẳn vòng lặp ngay lập tức
for (const so of [1, 2, 3, 4, 5]) {
if (so === 3) break;
console.log(so); // in 1, 2 rồi dừng
}
// continue — bỏ qua phần còn lại của vòng hiện tại, sang vòng kế
for (const so of [1, 2, 3, 4, 5]) {
if (so % 2 === 0) continue; // bỏ qua số chẵn
console.log(so); // in 1, 3, 5
}break— dừng toàn bộ vòng lặp.continue— bỏ qua lần lặp hiện tại, tiếp tục lần sau.%là toán tử chia lấy dư (modulo);so % 2 === 0nghĩa là số chẵn.
Liên hệ với testing
Một ví dụ tư duy sát nghề — kiểm tra một danh sách sản phẩm đều có giá hợp lệ:
const giaSanPham = [100, 250, 0, 80];
for (const gia of giaSanPham) {
if (gia <= 0) {
console.log(`LỖI: phát hiện giá không hợp lệ (${gia})`);
} else {
console.log(`OK: giá ${gia}`);
}
}Về sau với Playwright, bạn sẽ lặp qua các dòng của một bảng hoặc các item trong danh sách để kiểm tra từng cái — cấu trúc y hệt ví dụ này.
Lỗi thường gặp
- Vòng lặp vô hạn: quên cập nhật biến đếm (thiếu
i++) hoặc điều kiện luôntrue→ chương trình treo. Nếu terminal đứng im, nhấnCtrl + Cđể dừng. - Lệch chỉ số (off-by-one): dùng
i <= 5thay vìi < 5khi lặp 5 lần → chạy dư một vòng. Nhớ đếm từ 0. - Dùng
for...oftrên number:for...ofchỉ chạy trên danh sách (iterable), không chạy trên một số đơn lẻ →TypeError.
Ở Bài 7 ta học hàm — cách đóng gói một khối code thành một đơn vị tái sử dụng, gọi lại bất cứ khi nào cần.
🛠 Thực hành
- Đếm và tính tổng: dùng
forcổ điển in các số từ 1 đến 10, đồng thời tính tổng của chúng và in kết quả cuối. - Duyệt danh sách: cho mảng
['An', 'Binh', 'Chi'], dùngfor...ofin raXin chao <ten>cho từng người. - Lọc bằng continue: duyệt mảng số từ 1 đến 20, chỉ in ra các số chia hết cho 3 (gợi ý:
so % 3 === 0). - Thử while: viết vòng lặp
whileđếm ngược từ 5 về 1 rồi in'Bắt đầu!'. Sau đó thử xóa dòng cập nhật biến đếm và quan sát vòng lặp vô hạn (nhấnCtrl + Cđể dừng). - for…of vs for…in: với mảng
['a', 'b', 'c'], chạy cảfor...ofvàfor...inin ra biến lặp, so sánh kết quả và giải thích khác biệt.
Website tham khảo
- MDN — Looping code (tiếng Việt) — vòng lặp cho người mới.
- javascript.info — Loops: while and for — vòng lặp chi tiết.
- MDN — for…of — đặc tả
for...of.