JavaScript: Vòng lặp
Trong nhiều tình huống thì một lệnh hay một khối lệnh cần phải được thực hiện lặp đi lặp lại nhiều lần. Vòng lặp là một cách lý tưởng để thực hiện điều này. Một vòng lặp đại diện cho một tập hợp các lệnh phải được lặp. Trong ngữ cảnh của vòng lặp, sự lặp lại được gọi là phép lặp.
Hình dưới đây minh họa việc phân loại các vòng lặp:
Vòng lặp xác định (Definite)
Là vòng lặp mà ta có thể xác định được số lần lặp.
Vòng lặp for
Cú pháp:
for (khởi_tạo; điều_kiện; tăng_giảm) { //khối_lệnh }
Vòng lặp for thực thi khối mã trong một số lần xác định. Nó có thể được sử dụng để lặp qua một tập hợp các giá trị cố định, chẳng hạn như một mảng. Ví dụ:
var num = 10 var total = 0; for( let i = num ; i >= 1; i-- ) { total += i; } console.log(total);
Vòng lặp for có ba phần: phần khởi tạo (i = num), phần điều kiện (i> = 1) và phần tăng/giảm (i--).
Trong cùng một phần của vòng lặp for ta được quyền kết hợp nhiều lệnh phân cách nhau bằng dấu phẩy (,). Ví dụ vòng lặp sau đây in các số <30 của dãy Fibonacci.
"use strict" for(let k, i = 0, j = 1; j<30; k = i, i = j, j = i + k) console.log(j);
Output:
1 1 2 3 5 8 13 21
Vòng lặp for...in
Vòng lặp for...in
thường được sử dụng để lặp qua các thuộc tính của đối tượng.
Sau đây là cú pháp của 'cho vòng lặp trong'.
for (tên_biến in object) { khối_lệnh }
Mỗi lần lặp thì một thuộc tính từ đối tượng được lấy và gán cho tên_biến và vòng lặp sẽ tiếp tục cho đến khi tất cả các thuộc tính của đối tượng được lấy hết.
Ví dụ
var obj = {a:1, b:2, c:3}; for (var prop in obj) { console.log(obj[prop]); }
Ví dụ trên minh họa việc lặp lại một đối tượng bằng vòng lặp for ... in. Đầu ra sau đây được hiển thị khi thực thi mã thành công.
1 2 3
Vòng lặp for...of
Vòng lặp for...of được sử dụng để lặp lại các vòng lặp thay vì các hằng đối tượng.
Cú pháp:
for (tên_biến of object) { khối_lệnh }
Ví dụ:
for (let a of [12 , 13 , 123]) { console.log(a) }
Output:
12 13 123
Vòng lặp không xác định (Indefinite)
Một vòng lặp không xác định sẽ được sử dụng khi ta không xác định được số lần lặp.
Vòng lặp while sẽ thực hiện kiểm tra điều kiện (condition) trước, nếu điều kiện đúng thì sẽ thực hiện khối lệnh rồi lại quay lên kiểm tra điều kiện, việc lặp được thực hiện cho đến khi điều kiện sai.
Sơ đồ
Cú pháp
while (điều_kiện) { khối_lệnh }
Ví dụ
var n = 6; var fa = 1; while(n >= 1) { fa *= n; n--; } console.log("Giai thừa = " + fa);
Output:
Giai thừa = 720
Các lệnh điều khiển vòng lặp
Lệnh break
Câu lệnh break
được sử dụng để thoát khỏi vòng lặp.
Ví dụ
var i = 1 while(i<= 10) { if (i % 5 == 0) { console.log("Số đầu tiên chia hết cho 5 trong đoạn [1,10] là : "+i) break //thoát khỏi vòng lặp while } i++ }
Output:
Số đầu tiên chia hết cho 5 trong đoạn [1,10] là : 5
Lệnh continue
Câu lệnh continue sẽ bỏ qua lần lặp hiện thời của vòng lặp.
Ví dụ
var num = 0 var count = 0 for(num = 0; num <= 20; num++) { if (num % 2 == 0) { continue } count++ } console.log("Số lượng những số lẻ trong đoạn [0,20] là: "+count)
Output:
Số lượng những số lẻ trong đoạn [0,20] là: 10
Sử dụng label để kiểm soát luồng xử lý
Một nhãn chỉ đơn giản là một định danh và theo sau nó là dấu hai chấm (:), được áp dụng cho một câu lệnh hoặc một khối lệnh. Một nhãn có thể được sử dụng với break và continue để có thể kiểm soát tốt hơn luồng xử lý trong lập trình.
Ngắt dòng không được phép nằm giữa câu lệnh 'continue' hay 'break' và tên nhãn. Ngoài ra, không được có bất kỳ lệnh nào khác ở giữa tên nhãn và vòng lặp liên quan.
Label với lệnh break
Một nhãn có thể được sử dụng với sự phá vỡ và tiếp tục kiểm soát dòng chảy chính xác hơn.
Ví dụ
outerLoop: // Đây là nhãn for (var i = 0; i < 5; i++) { console.log("Outer: " + i); innerLoop: // Đây là nhãn nữa for (var j = 0; j<5; j++) { if (j>3 ) break; // Thoát khỏi nhãn innerLoop if (i == 2) break innerLoop; // Thoát khỏi nhãn outerLoop if (i == 4) break outerLoop; console.log("Inner: " + j); } }
Kết quả:
Outer: 0 Inner: 0 Inner: 1 Inner: 2 Inner: 3 Outer: 1 Inner: 0 Inner: 1 Inner: 2 Inner: 3 Outer: 2 Outer: 3 Inner: 0 Inner: 1 Inner: 2 Inner: 3 Outer: 4
Label với lệnh continue
Nhắc lại là ngắt dòng không được phép giữa câu lệnh 'continue' hay 'break' và tên nhãn.
Ví dụ
outerLoop: // Đây là nhãn for (var i = 0; i < 3; i++) { console.log("Outerloop: " + i); for (var j = 0; j < 5; j++) { if (j == 3){ //nếu j==3 continue outerLoop; //thì sẽ bỏ qua lần lặp hiện thời của vòng lặp for ngoài } console.log("Innerloop: " + j ); } }
Output:
Outerloop: 0 Innerloop: 0 Innerloop: 1 Innerloop: 2 Outerloop: 1 Innerloop: 0 Innerloop: 1 Innerloop: 2 Outerloop: 2 Innerloop: 0 Innerloop: 1 Innerloop: 2