JavaScript 中 for、forEach、for...in、for...of 循環的區別和使用
JavaScript 中有多種循環語句,包括傳統的 for 循環、forEach 方法、for...in 循環和 for...of 循環。這些循環語句各有特點,適用于不同的場景。下面將分別介紹它們的區別和使用,并給出相應的例子。
1. for 循環
for 循環是 JavaScript 中最常用的循環語句之一,它的基本語法為:
for (初始化; 條件; 遞增或遞減) {
// 循環體
}
- 初始化:在循環開始之前執行的代碼,用于初始化循環控制變量。
- 條件:在每次迭代之前進行條件檢查,如果條件為真,則執行循環體;否則循環終止。
- 遞增或遞減:在每次迭代之后執行的代碼,用于更新循環控制變量。
示例:
// 使用 for 循環計算數組中所有元素的總和
let numbers = [1, 2, 3, 4, 5];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
console.log(sum); // 輸出:15
2. forEach 方法
forEach 是 JavaScript 數組對象的一個方法,用于遍歷數組的每個元素,并對每個元素執行指定的回調函數。其基本語法為:
array.forEach(function(currentValue, index, array) {
// 回調函數
});
- currentValue:當前迭代的元素值。
- index:當前迭代的索引。
- array:原始數組對象。
示例:
// 使用 forEach 方法計算數組中所有元素的總和
let numbers = [1, 2, 3, 4, 5];
let sum = 0;
numbers.forEach(function(number) {
sum += number;
});
console.log(sum); // 輸出:15
3. for...in 循環
for...in 循環用于遍歷對象的可枚舉屬性,并執行指定的代碼塊。其基本語法為:
for (let key in object) {
// 執行代碼
}
- key:對象的屬性名。
- object:被遍歷的對象。
需要注意的是,for...in 循環不僅遍歷對象自身的屬性,還會遍歷繼承的屬性,因此在遍歷對象時,通常需要使用 hasOwnProperty 方法來過濾掉繼承的屬性。
示例:
// 使用 for...in 循環遍歷對象的屬性
let person = {
name: 'John',
age: 30,
gender: 'male'
};
for (let key in person) {
if (person.hasOwnProperty(key)) {
console.log(key + ': ' + person[key]);
}
}
// 輸出:
// name: John
// age: 30
// gender: male
4. for...of 循環
for...of 循環是 ES6 引入的一種遍歷可迭代對象的語法,包括數組、字符串、Set、Map、Generator 對象等。其基本語法為:
for (let element of iterable) {
// 執行代碼
}
- element:當前迭代的元素值。
- iterable:可迭代對象,例如數組、字符串等。
與 for...in 循環不同,for...of 循環只遍歷可迭代對象自身的元素,不會遍歷對象的屬性。
示例:
// 使用 for...of 循環遍歷數組
let numbers = [1, 2, 3, 4, 5];
let sum = 0;
for (let number of numbers) {
sum += number;
}
console.log(sum); // 輸出:15
區別和使用場景
- for 循環:
- 適用于需要對數組或類數組對象進行精確控制的情況,例如根據索引訪問數組元素、逐個修改數組元素等。
- 可以使用 break 和 continue 控制循環的流程。
- forEach 方法:
- 簡化了對數組的遍歷,代碼更加簡潔易讀。
- 不能使用 break 和 continue 控制循環的流程。
- for...in 循環:
- 適用于遍歷對象的屬性,特別是需要遍歷對象的所有可枚舉屬性的情況。
- 需要注意過濾掉繼承的屬性。
- for...of 循環:
- 適用于遍歷可迭代對象的情況,包括數組、字符串等。
- 不適用于遍歷對象的屬性,只能遍歷對象的值。
不同的循環語句各有特點,應根據具體的需求和場景選擇合適的循環方式。