Giới thiệu
Từ thời còn học đại học, tôi đã lập trình bằng Java, JavaScript, Pascal, ABAP , PHP, Progress 4GL, C / C ++ và có thể một vài ngôn ngữ khác mà tôi không thể nghĩ ra ngay bây giờ.
Mặc dù tất cả chúng đều có những đặc điểm ngôn ngữ riêng, mỗi ngôn ngữ này có chung nhiều khái niệm cơ bản. Các khái niệm này bao gồm các thủ tục / chức năng IF
, FOR
-statements, WHILE
-loops và -loops.
Một for
-loop truyền thống
Một for
vòng lặp truyền thống có ba thành phần:
- Việc khởi tạo: được thực hiện trước khi khối nhìn được thực thi lần đầu tiên
- Điều kiện: kiểm tra một điều kiện mỗi lần trước khi khối vòng lặp được thực thi và thoát khỏi vòng lặp nếu sai
- Suy nghĩ lại: được thực hiện mỗi lần sau khi khối vòng lặp được thực thi
Ba thành phần này được phân tách với nhau bằng một ;
biểu tượng. Nội dung cho mỗi ba thành phần này là tùy chọn, có nghĩa là sau đây là for
vòng lặp tối thiểu nhất có thể:
for (;;) {
// Do stuff
}
Tất nhiên, bạn sẽ cần bao gồm một if(condition === true) { break; }
hoặc một if(condition === true) { return; }
nơi nào đó bên trong đó for
để làm cho nó ngừng chạy.
Tuy nhiên, thông thường, việc khởi tạo được sử dụng để khai báo một chỉ mục, điều kiện được sử dụng để so sánh chỉ mục đó với giá trị tối thiểu hoặc tối đa và sau đó được sử dụng để tăng chỉ mục:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
Sử dụng một for
vòng lặp truyền thống để lặp qua một mảng
Cách truyền thống để lặp qua một mảng là:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
Hoặc, nếu bạn muốn lặp lại, bạn làm điều này:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Tuy nhiên, có nhiều biến thể có thể, ví dụ như biến thể này:
for (var key = 0, value = myArray[key], length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... hoặc cái này ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... hoặc cái này:
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
Bất cứ điều gì hoạt động tốt nhất phần lớn là vấn đề của cả sở thích cá nhân và trường hợp sử dụng cụ thể mà bạn đang thực hiện.
Lưu ý rằng mỗi biến thể này đều được hỗ trợ bởi tất cả các trình duyệt, kể cả những biến thể rất cũ!
Một while
vòng lặp
Một thay thế cho một for
vòng lặp là một while
vòng lặp. Để lặp qua một mảng, bạn có thể làm điều này:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Giống như các for
vòng lặp truyền thống ,while
các vòng lặp được hỗ trợ bởi ngay cả các trình duyệt lâu đời nhất.
Ngoài ra, lưu ý rằng mỗi vòng lặp while có thể được viết lại dưới dạng for
vòng lặp. Ví dụ: while
vòng lặp ở trên hoạt động theo cách chính xác giống như for
vòng này :
for(var key = 0; value = myArray[key++];){
console.log(value);
}
For...in
và for...of
Trong JavaScript, bạn cũng có thể làm điều này:
for (i in myArray) {
console.log(myArray[i]);
}
Điều này nên được sử dụng cẩn thận, tuy nhiên, vì nó không hoạt động giống như một for
vòng lặp truyền thống trong mọi trường hợp và có những tác dụng phụ tiềm ẩn cần được xem xét. Xem Tại sao sử dụng "for ... in" với việc lặp mảng là một ý tưởng tồi? để biết thêm chi tiết.
Thay thế cho for...in
, bây giờ cũng cho for...of
. Ví dụ sau đây cho thấy sự khác biệt giữa một for...of
vòng lặp và một for...in
vòng lặp:
var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
console.log(i); // logs 3, 5, 7
}
Ngoài ra, bạn cần xem xét rằng không có phiên bản Internet Explorer nào hỗ trợ for...of
( Edge 12+ ) và điều đó for...in
yêu cầu ít nhất Internet Explorer 10.
Array.prototype.forEach()
Một thay thế cho for
-loops là Array.prototype.forEach()
, sử dụng cú pháp sau:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Array.prototype.forEach()
được hỗ trợ bởi tất cả các trình duyệt hiện đại, cũng như Internet Explorer 9 trở lên.
Thư viện
Cuối cùng, nhiều thư viện tiện ích cũng có foreach
biến thể riêng . AFAIK, ba cái phổ biến nhất là:
jQuery.each()
, trong jQuery :
$.each(myArray, function(key, value) {
console.log(value);
});
_.each()
, trong Underscore.js :
_.each(myArray, function(value, key, myArray) {
console.log(value);
});
_.forEach()
, trong Lodash.js :
_.forEach(myArray, function(value, key) {
console.log(value);
});