Cách sử dụng vòng lặp for trong JavaScript

Javascript căn bản | by Học Javascript

Trong lập trình JavaScript, vòng lặp là một công cụ quan trọng giúp tự động hóa các tác vụ lặp đi lặp lại, tối ưu hóa mã nguồn và tiết kiệm thời gian. Một trong những vòng lặp phổ biến nhất là vòng lặp for, cho phép lập trình viên thực hiện các thao tác lặp lại theo một điều kiện nhất định.

Vòng lặp for đóng vai trò quan trọng trong việc duyệt mảng, xử lý dữ liệu, tạo hiệu ứng động, cũng như thực hiện các thuật toán một cách hiệu quả. So với các loại vòng lặp khác, for có cú pháp rõ ràng và dễ kiểm soát, giúp tối ưu hiệu suất khi làm việc với dữ liệu lớn.

Trong bài viết này, mình sẽ tìm hiểu chi tiết về cú pháp, cách hoạt động, các biến thể của vòng lặp for, cũng như ứng dụng thực tế trong lập trình JavaScript.

Vòng lặp for trong JavaScript

Trong JavaScript, vòng lặp là một cấu trúc điều khiển giúp lặp lại một khối mã nhiều lần dựa trên một điều kiện cụ thể. Vòng lặp giúp tự động hóa các tác vụ lặp lại, giảm thiểu việc viết mã thừa và tối ưu hiệu suất của chương trình.

Một trong những vòng lặp phổ biến nhất trong JavaScript là vòng lặp for. Vòng lặp for cho phép chúng ta thực hiện một khối lệnh nhiều lần với số lần lặp được xác định trước. Nó giúp kiểm soát luồng lặp một cách chặt chẽ bằng cách sử dụng biến lặp (iterator) và các điều kiện lặp.

Vai trò của vòng lặp for trong lập trình JavaScript

Vòng lặp for đóng một vai trò quan trọng trong lập trình, giúp:

  • Tự động hóa các thao tác lặp lại, tiết kiệm thời gian và công sức.
  • Duyệt qua các phần tử trong mảng hoặc đối tượng để truy xuất và xử lý dữ liệu.
  • Tối ưu hóa mã nguồn, giúp chương trình ngắn gọn, dễ hiểu và dễ bảo trì.
  • Thực thi các thuật toán hiệu quả, chẳng hạn như tìm kiếm, sắp xếp, hoặc tính toán trên tập dữ liệu lớn.

Cú pháp và cách hoạt động của vòng lặp for trong JavaScript

Cú pháp cơ bản của vòng lặp for

for (khởi_tạo; điều_kiện; bước_lặp) {
    // Khối lệnh thực thi trong mỗi vòng lặp
}

Giải thích từng phần trong vòng lặp for

Vòng lặp for có ba phần chính, được ngăn cách bởi dấu chấm phẩy (;):

Khởi tạo (initialization):

  • Định nghĩa và khởi tạo biến đếm (thường là let i = 0).
  • Phần này chỉ chạy một lần duy nhất trước khi vòng lặp bắt đầu.

Điều kiện (condition):

  • Xác định điều kiện để tiếp tục chạy vòng lặp (ví dụ: i < 10).
  • Nếu điều kiện đúng (true), vòng lặp tiếp tục chạy.
  • Nếu điều kiện sai (false), vòng lặp dừng lại.

Bước lặp (iteration):

  • Xác định cách thay đổi biến đếm sau mỗi lần lặp (ví dụ: i++, i += 2).

Cách hoạt động của vòng lặp for

Bắt đầu vòng lặp:

  • Chạy phần khởi tạo (khai báo biến đếm).

Kiểm tra điều kiện:

  • Nếu điều kiện đúng, thực thi khối lệnh trong vòng lặp.
  • Nếu điều kiện sai, vòng lặp kết thúc.

Thực thi khối lệnh:

  • Chạy đoạn mã bên trong { }.

Thực hiện bước lặp:

  • Cập nhật biến đếm (tăng hoặc giảm giá trị).

Lặp lại quy trình:

  • Quay lại bước 2 (kiểm tra điều kiện).
  • Tiếp tục lặp đến khi điều kiện trở thành false.

Ví dụ minh họa vòng lặp for trong JavaScript

Ví dụ 1: In số từ 1 đến 5

for (let i = 1; i <= 5; i++) {
    console.log("Giá trị của i:", i);
}

Giải thích:

  • Bước khởi tạo: let i = 1 (biến i bắt đầu từ 1).
  • Kiểm tra điều kiện: i <= 5 (nếu i nhỏ hơn hoặc bằng 5, vòng lặp tiếp tục).
  • Thực thi khối lệnh: In ra giá trị i.
  • Bước lặp: i++ (tăng i lên 1).

Kết quả đầu ra:

Giá trị của i: 1
Giá trị của i: 2
Giá trị của i: 3
Giá trị của i: 4
Giá trị của i: 5

Ví dụ 2: In số chẵn từ 2 đến 10

for (let i = 2; i <= 10; i += 2) {
    console.log("Số chẵn:", i);
}

Giải thích:

  • Khởi tạo: let i = 2 (bắt đầu từ 2).
  • Điều kiện: i <= 10 (vòng lặp tiếp tục nếu i nhỏ hơn hoặc bằng 10).
  • Thực thi: In giá trị i.
  • Bước lặp: i += 2 (tăng i lên 2 sau mỗi lần lặp).

Kết quả đầu ra:

Số chẵn: 2
Số chẵn: 4
Số chẵn: 6
Số chẵn: 8
Số chẵn: 10

Ví dụ 3: Duyệt qua mảng bằng vòng lặp for

let fruits = ["Táo", "Chuối", "Cam", "Dưa hấu"];

for (let i = 0; i < fruits.length; i++) {
    console.log("Trái cây:", fruits[i]);
}

Giải thích:

  • Khởi tạo: let i = 0 (bắt đầu từ phần tử đầu tiên).
  • Điều kiện: i < fruits.length (chạy đến khi i bằng độ dài của mảng).
  • Thực thi: In ra phần tử của mảng.
  • Bước lặp: i++ (tăng i lên 1).

Kết quả đầu ra:

Trái cây: Táo
Trái cây: Chuối
Trái cây: Cam
Trái cây: Dưa hấu

Các biến thể của vòng lặp for trong JavaScript

Vòng lặp for trong JavaScript có nhiều biến thể khác nhau, tùy vào nhu cầu sử dụng mà ta có thể điều chỉnh cấu trúc của nó. Dưới đây là các biến thể phổ biến của vòng lặp for cùng với ví dụ minh họa.

Vòng lặp for cơ bản

Vòng lặp for thông thường có cấu trúc đầy đủ gồm ba phần: khởi tạo, điều kiện và bước lặp.

Ví dụ: In ra số lần lặp từ 0 đến 4

for (let i = 0; i < 5; i++) {
    console.log("Lặp lần thứ:", i);
}

Giải thích:

  • Khởi tạo (let i = 0): Biến i bắt đầu từ 0.
  • Điều kiện (i < 5): Chạy đến khi i nhỏ hơn 5.
  • Bước lặp (i++): Tăng i lên 1 sau mỗi lần lặp.

Kết quả đầu ra:

Lặp lần thứ: 0
Lặp lần thứ: 1
Lặp lần thứ: 2
Lặp lần thứ: 3
Lặp lần thứ: 4

Vòng lặp for duyệt mảng

Dùng vòng lặp for để duyệt qua từng phần tử của mảng.

Ví dụ: In ra các phần tử của mảng số

let numbers = [10, 20, 30, 40];
for (let i = 0; i < numbers.length; i++) {
    console.log("Giá trị:", numbers[i]);
}

Giải thích:

  • Khởi tạo (let i = 0): Bắt đầu từ phần tử đầu tiên (index = 0).
  • Điều kiện (i < numbers.length): Duyệt qua toàn bộ phần tử trong mảng.
  • Bước lặp (i++): Di chuyển sang phần tử tiếp theo.
  • numbers[i] lấy giá trị của phần tử tại vị trí i trong mảng.

Kết quả đầu ra:

Giá trị: 10
Giá trị: 20
Giá trị: 30
Giá trị: 40

Vòng lặp for giảm dần

Thông thường, vòng lặp for tăng giá trị biến đếm (i++), nhưng cũng có thể giảm dần (i--).

Ví dụ: In số từ 5 đến 1

for (let i = 5; i >= 1; i--) {
    console.log("Giá trị giảm:", i);
}

Giải thích:

  • Khởi tạo (let i = 5): Bắt đầu từ 5.
  • Điều kiện (i >= 1): Chạy đến khi i bằng 1.
  • Bước lặp (i--): Giảm i xuống 1 sau mỗi lần lặp.

Kết quả đầu ra:

Giá trị giảm: 5
Giá trị giảm: 4
Giá trị giảm: 3
Giá trị giảm: 2
Giá trị giảm: 1

Vòng lặp for bỏ qua bước cập nhật (cập nhật trong thân vòng lặp)

Thông thường, bước lặp (i++) được đặt trong dấu ngoặc () của for. Tuy nhiên, ta có thể bỏ nó ra ngoài và cập nhật biến đếm bên trong thân vòng lặp.

Ví dụ: Cập nhật biến i trong thân vòng lặp

let i = 0;
for (; i < 5;) {  // Không có phần khởi tạo và bước lặp trong dấu ngoặc
    console.log("Giá trị:", i);
    i++;  // Cập nhật biến trong thân vòng lặp
}

Giải thích:

  • Khởi tạo (let i = 0): Thực hiện trước khi vòng lặp bắt đầu.
  • Điều kiện (i < 5): Vẫn có điều kiện kiểm tra.
  • Bước lặp (i++): Được di chuyển vào trong { }.

Kết quả đầu ra:

Giá trị: 0
Giá trị: 1
Giá trị: 2
Giá trị: 3
Giá trị: 4

Vòng lặp for không có điều kiện (vòng lặp vô hạn)

Nếu bỏ trống cả ba phần của vòng lặp for, nó sẽ chạy vô hạn (trừ khi có câu lệnh break).

Ví dụ: Tạo vòng lặp vô hạn và dừng bằng break

for (;;) {
    console.log("Chạy mãi mãi");
    break;  // Dừng vòng lặp để tránh chạy vô hạn
}

Giải thích:

  • Không có khởi tạo, điều kiện, hay bước lặp.
  • Vòng lặp sẽ chạy mãi mãi trừ khi có break để dừng nó.

Kết quả đầu ra:

Chạy mãi mãi

Lưu ý: Nếu không có break, vòng lặp này sẽ tiếp tục chạy vô hạn, gây treo trình duyệt hoặc chương trình.

Biến thể Cách sử dụng Ví dụ
Vòng lặp for cơ bản Duyệt số lần cố định In số từ 0 đến 4
Vòng lặp for duyệt mảng Duyệt qua các phần tử trong mảng In từng giá trị của mảng số
Vòng lặp for giảm dần Duyệt số lần giảm dần In số từ 5 đến 1
Vòng lặp for bỏ qua bước cập nhật Cập nhật biến trong thân vòng lặp In số từ 0 đến 4 nhưng cập nhật i trong {}
Vòng lặp for vô hạn Không có điều kiện dừng (cần break) Chạy vô hạn trừ khi có break

Vòng lặp for...in và for...of trong JavaScript

Bên cạnh vòng lặp for thông thường, JavaScript còn cung cấp hai loại vòng lặp đặc biệt:

  • for...in: Duyệt qua các thuộc tính (key) của một đối tượng (object).
  • for...of: Duyệt qua các phần tử của mảng hoặc các đối tượng có thể lặp (iterable object như Array, String, Set, Map).

Dưới đây là chi tiết về cách sử dụng và ứng dụng của từng loại vòng lặp.

Vòng lặp for...in

Cách hoạt động

  • for...in duyệt qua các thuộc tính (key) của một đối tượng.
  • Giá trị của mỗi key có thể được truy xuất bằng object[key].
  • Thường được dùng để duyệt các thuộc tính của một object.

Ví dụ: Duyệt qua các thuộc tính của một object

let person = { name: "John", age: 30, city: "New York" };

for (let key in person) {
    console.log(key + ":", person[key]);
}

Giải thích:

  • key lần lượt nhận giá trị "name", "age", "city".
  • person[key] lấy giá trị tương ứng của thuộc tính đó trong object.

Kết quả đầu ra:

name: John
age: 30
city: New York

Ứng dụng của vòng lặp for...in

Duyệt qua tất cả thuộc tính của một object.
Kiểm tra dữ liệu của một object một cách linh hoạt.
Có thể sử dụng để lặp qua các chỉ mục (index) của mảng, nhưng không khuyến khích do for...of tốt hơn cho mảng.

Lưu ý khi dùng for...in với mảng:

  • for...in không đảm bảo thứ tự các phần tử trong mảng.
  • Nên dùng for...of để duyệt mảng thay vì for...in.

Ví dụ không khuyến khích:

let numbers = [10, 20, 30, 40];
for (let index in numbers) {
    console.log("Chỉ mục:", index, "Giá trị:", numbers[index]);
}

Kết quả đầu ra:

Chỉ mục: 0 Giá trị: 10
Chỉ mục: 1 Giá trị: 20
Chỉ mục: 2 Giá trị: 30
Chỉ mục: 3 Giá trị: 40

Mặc dù vẫn hoạt động, nhưng vòng lặp này trả về chỉ mục (index) thay vì giá trị. Vì vậy, for...of sẽ tốt hơn khi duyệt mảng.

Vòng lặp for...of

Cách hoạt động

  • for...of duyệt trực tiếp qua các giá trị của mảng hoặc iterable object (chuỗi, Set, Map, v.v.).
  • Thường được dùng để duyệt nhanh qua mảng mà không cần truy cập chỉ mục.

Ví dụ: Duyệt qua từng phần tử trong một mảng

let numbers = [1, 2, 3, 4];

for (let num of numbers) {
    console.log(num);
}

Giải thích:

  • num lần lượt nhận giá trị 1, 2, 3, 4 mà không cần dùng numbers[i].

Kết quả đầu ra:

1
2
3
4

Ví dụ 1: Duyệt từng ký tự trong chuỗi

let text = "Hello";

for (let char of text) {
    console.log(char);
}

Kết quả đầu ra:

H
e
l
l
o

for...of giúp trích xuất từng ký tự trong chuỗi một cách dễ dàng.

Ví dụ 2: Duyệt qua Set

let uniqueNumbers = new Set([10, 20, 30, 40]);

for (let num of uniqueNumbers) {
    console.log(num);
}

Giải thích:

  • num lần lượt nhận giá trị 1, 2, 3, 4 mà không cần dùng numbers[i].

Kết quả đầu ra:

10
20
30
40

Set không chứa phần tử trùng lặp, nên vòng lặp sẽ duyệt qua từng giá trị duy nhất.

Ví dụ 3: Duyệt qua Map

let userRoles = new Map([
    ["Alice", "Admin"],
    ["Bob", "Editor"],
    ["Charlie", "Viewer"]
]);

for (let [user, role] of userRoles) {
    console.log(user + " là " + role);
}

Kết quả đầu ra:

Alice là Admin
Bob là Editor
Charlie là Viewer

for...of giúp duyệt qua cả key và value trong Map mà không cần truy cập thủ công.

So sánh for...in và for...of trong JavaScript

Tiêu chí for...in for...of
Duyệt qua Các thuộc tính (key) của object hoặc index của mảng Các phần tử (value) của iterable object (mảng, chuỗi, Set, Map)
Trả về Key của object hoặc index của mảng Giá trị của từng phần tử
Dùng cho Object Mảng, chuỗi, Set, Map
Ứng dụng phổ biến Lấy danh sách thuộc tính của object Duyệt nhanh các phần tử trong mảng, chuỗi hoặc iterable object
Có đảm bảo thứ tự không? Không đảm bảo thứ tự Đảm bảo thứ tự

Ứng dụng thực tế của vòng lặp for trong JavaScript

Vòng lặp for là một công cụ mạnh mẽ giúp tự động hóa nhiều tác vụ trong lập trình. Dưới đây là một số ứng dụng phổ biến trong thực tế:

Duyệt qua danh sách sản phẩm trong mảng và hiển thị lên giao diện

Khi làm việc với danh sách sản phẩm trong một trang web thương mại điện tử, ta có thể sử dụng vòng lặp for để hiển thị chúng lên giao diện.

Ví dụ: Hiển thị danh sách sản phẩm trong HTML

let products = ["iPhone", "Samsung Galaxy", "MacBook", "iPad"];

for (let i = 0; i < products.length; i++) {
    console.log("Sản phẩm:", products[i]);
}

Hiển thị danh sách sản phẩm trong div hoặc table.
Duyệt qua danh sách sản phẩm để thêm vào giỏ hàng.

Tạo bảng dữ liệu tự động trong HTML

Vòng lặp for giúp tạo bảng động bằng cách lặp qua dữ liệu và thêm vào HTML.

Ví dụ: Tạo bảng hiển thị số từ 1 đến 5

let tableHTML = "<table border='1'><tr><th>STT</th><th>Giá trị</th></tr>";

for (let i = 1; i <= 5; i++) {
    tableHTML += `<tr><td>${i}</td><td>Giá trị ${i}</td></tr>`;
}

tableHTML += "</table>";
document.write(tableHTML);

Ứng dụng:
Hiển thị danh sách người dùng, đơn hàng, báo cáo.
Tạo bảng động dựa trên dữ liệu từ API hoặc cơ sở dữ liệu.

Tính tổng, trung bình của một dãy số

Vòng lặp for giúp thực hiện các phép tính nhanh chóng, chẳng hạn như tính tổng hoặc trung bình của một danh sách số.

Ví dụ: Tính tổng và trung bình của một mảng số

let numbers = [10, 20, 30, 40, 50];
let sum = 0;

for (let i = 0; i < numbers.length; i++) {
    sum += numbers[i];
}

let average = sum / numbers.length;
console.log("Tổng:", sum);
console.log("Trung bình:", average);

Tính tổng doanh thu, tổng điểm của học sinh.
Tính toán số liệu thống kê trong báo cáo.

Tìm kiếm phần tử trong danh sách

Vòng lặp for giúp tìm kiếm một phần tử trong mảng một cách hiệu quả.

Ví dụ: Tìm kiếm một sản phẩm trong danh sách

let products = ["iPhone", "Samsung", "MacBook", "iPad"];
let search = "MacBook";
let found = false;

for (let i = 0; i < products.length; i++) {
    if (products[i] === search) {
        console.log(`${search} được tìm thấy ở vị trí ${i}`);
        found = true;
        break;
    }
}

if (!found) {
    console.log("Không tìm thấy sản phẩm");
}

Tìm kiếm sản phẩm trong danh sách.
Kiểm tra xem một người dùng có tồn tại trong hệ thống hay không.

Tạo hiệu ứng lặp lại trong các ứng dụng web (ví dụ: carousel, slideshow)

Vòng lặp for có thể được sử dụng để tạo hiệu ứng hiển thị hình ảnh liên tục trong trình chiếu (slideshow).

Ví dụ: Tạo hiệu ứng chuyển đổi hình ảnh

let images = ["img1.jpg", "img2.jpg", "img3.jpg"];
let index = 0;

function showImage() {
    console.log("Hiển thị ảnh:", images[index]);
    index = (index + 1) % images.length; // Quay lại ảnh đầu tiên khi hết danh sách
}

setInterval(showImage, 2000); // Cập nhật ảnh mỗi 2 giây Hiển thị thông báo quảng cáo tự động.

Lưu ý khi sử dụng vòng lặp for trong JavaScript

Mặc dù vòng lặp for rất hữu ích, nhưng việc sử dụng không đúng cách có thể gây ra lỗi hoặc làm giảm hiệu suất. Dưới đây là một số lưu ý quan trọng:

Tránh vòng lặp vô hạn (luôn đảm bảo điều kiện dừng)

Nếu không có điều kiện dừng, vòng lặp sẽ chạy mãi mãi và gây treo chương trình.

Ví dụ sai: Vòng lặp vô hạn

for (let i = 0; ; i++) { // Không có điều kiện dừng
    console.log(i);
}

Chương trình sẽ không bao giờ dừng lại.

Cách sửa: Đảm bảo có điều kiện dừng.

for (let i = 0; i < 10; i++) { 
    console.log(i);
}

Khi duyệt mảng, sử dụng .length để tránh lỗi truy xuất ngoài phạm vi

Ví dụ sai: Truy cập ngoài phạm vi mảng

let numbers = [10, 20, 30, 40];
for (let i = 0; i <= numbers.length; i++) { // Lỗi: `i <= numbers.length`
    console.log(numbers[i]); // `numbers[4]` sẽ là `undefined`
}
Cách sửa: Sử dụng điều kiện đúng (i < numbers.length).
for (let i = 0; i < numbers.length; i++) {
    console.log(numbers[i]);
}

Khi duyệt đối tượng, nên dùng for...in thay vì vòng lặp for thông thường

Ví dụ sai: Dùng for để duyệt object

let person = { name: "John", age: 30 };
for (let i = 0; i < person.length; i++) { // Lỗi: Object không có `length`
    console.log(person[i]);
}
Cách sửa: Dùng for...in.
for (let key in person) {
    console.log(key + ":", person[key]);
}

Kết bài

Vòng lặp for là một trong những công cụ quan trọng và mạnh mẽ trong JavaScript, giúp thực hiện các thao tác lặp lại một cách tự động, tối ưu hóa mã nguồn và tăng hiệu suất xử lý dữ liệu. Với cú pháp đơn giản nhưng linh hoạt, for có thể được sử dụng để duyệt mảng, xử lý đối tượng, tạo bảng dữ liệu, tính toán số liệu và thậm chí là tạo hiệu ứng động trong giao diện web.

Tuy nhiên, khi sử dụng vòng lặp for, lập trình viên cần lưu ý tránh các lỗi phổ biến như vòng lặp vô hạn, truy cập ngoài phạm vi mảng, hoặc sử dụng sai kiểu vòng lặp cho từng loại dữ liệu. Ngoài ra, trong một số trường hợp, forEach hoặc for...of có thể là lựa chọn tốt hơn để giúp mã nguồn dễ đọc và bảo trì hơn.

Hiểu và sử dụng thành thạo vòng lặp for không chỉ giúp viết mã hiệu quả hơn mà còn nâng cao khả năng tư duy lập trình. Vì vậy, hãy thực hành nhiều để làm chủ vòng lặp này trong JavaScript!

Bài viết liên quan

  • 2