在 JavaScript 中,有多种方法可以用于循环或迭代数组、对象和其他可迭代结构。以下是一些常用的循环和迭代方法:
1. for
循环
- 描述:传统的
for
循环,适用于需要精确控制循环变量的情况。 - 用法:
for (let i = 0; i < array.length; i++) {
console.log(array[i]);
}
- 特点:灵活,可以控制循环的起始、结束和步长。
2. while
循环
- 描述:在条件为真时重复执行代码块。
- 用法:
let i = 0;
while (i < array.length) {
console.log(array[i]);
i++;
}
- 特点:适用于循环次数不确定的情况。
3. do...while
循环
- 描述:先执行一次代码块,然后在条件为真时重复执行。
- 用法:
let i = 0;
do {
console.log(array[i]);
i++;
} while (i < array.length);
- 特点:至少执行一次代码块。
4. for...of
循环
- 描述:用于遍历可迭代对象(如数组、字符串、Map、Set 等)。
- 用法:
for (const value of array) {
console.log(value);
}
- 特点:简洁,适用于遍历数组或其他可迭代对象。
5. for...in
循环
- 描述:用于遍历对象的可枚举属性。
- 用法:
for (const key in object) {
if (object.hasOwnProperty(key)) {
console.log(key, object[key]);
}
}
- 特点:遍历对象的键,但需要注意检查对象自身的属性(使用
hasOwnProperty
)。
6. forEach
方法
- 描述:数组方法,用于对数组的每个元素执行一次提供的函数。
- 用法:
array.forEach((value, index) => {
console.log(value, index);
});
- 特点:简洁,但不会返回新数组,也不改变原数组。
7. map
方法
- 描述:数组方法,返回一个新数组,其中包含对原数组每个元素调用一个函数后的结果。
- 用法:
const newArray = array.map(value => value * 2);
- 特点:用于转换数组,返回新数组。
8. filter
方法
- 描述:数组方法,返回一个新数组,其中包含原数组中所有通过指定函数测试的元素。
- 用法:
const filteredArray = array.filter(value => value > 10);
- 特点:用于筛选数组,返回新数组。
9. reduce
方法
- 描述:数组方法,对数组中的每个元素执行一个指定的归约函数(从左到右),以将其归约为单个值。
- 用法:
const sum = array.reduce((accumulator, value) => accumulator + value, 0);
- 特点:用于累加、累乘等操作,返回单个值。
10. for await...of
循环
- 描述:用于异步迭代可迭代对象(如异步生成器)。
- 用法:
async function process(asyncIterable) {
for await (const value of asyncIterable) {
console.log(value);
}
}
- 特点:适用于处理异步迭代。
11. entries()
、keys()
、values()
方法
- 描述:这些方法返回新的迭代器对象,可以与
for...of
循环一起使用。 - 用法:
for (const [key, value] of object.entries()) {
console.log(key, value);
}
for (const key of array.keys()) {
console.log(key);
}
for (const value of array.values()) {
console.log(value);
}
- 特点:提供对对象或数组的键、值或键值对的迭代。
总结
- 传统循环:
for
、while
、do...while
提供了灵活的循环控制。 - 数组迭代方法:
forEach
、map
、filter
、reduce
等提供了功能强大的数组操作。 - 可迭代对象迭代:
for...of
、for await...of
适用于遍历可迭代对象。 - 对象迭代:
for...in
和Object.entries()
、Object.keys()
、Object.values()
提供了对象属性的迭代。
选择哪种方法取决于具体的需求和场景。对于简单的数组遍历,forEach
或 for...of
可能更简洁;对于需要返回新数组的转换或筛选操作,map
或 filter
更合适;对于需要归约为单个值的操作,reduce
是最佳选择。