一、 for循环
for
循环是最基础的循环方式,适用于遍历数组、对象和其他可迭代对象。通过控制循环条件和步进来灵活控制循环过程。
const array = [1, 2, 3, 4, 5];
for (let i = 0; i < array.length; i++) {
console.log(array[i]);
}
for循环常见的四种写法
const persons = ['郑昊川', '钟忠', '高晓波', '韦贵铁', '杨俊', '宋灿']
// 方法一:最常见的方式
for (let i = 0; i < persons.length; i++) {
console.log(persons[i])
}
// 方法二:将persons.length缓存到变量len中,这样每次循环时就不会再读取数组的长度,性能略好与方法一
for (let i = 0, len = persons.length; i < len; i++) {
console.log(persons[i])
}
// 方法三:将取值与判断合并,通过不停的枚举每一项来循环,直到枚举到空值则循环结束
for (let i = 0, person; person = persons[i]; i++) {
console.log(person)
}
// 方法四:倒序循环
for (let i = persons.length; i--;) {
console.log(persons[i])
}
推荐:考虑到在不同环境或浏览器下的性能和效率。第四种i–
倒序循环的方式最优
不推荐:第三种方式,因为当数组里存在非Truthy
的值时,比如0
和”
,会导致循环直接结束
二、for...in
for…in
循环用于遍历对象的可枚举属性和原型链上的属性,包括原型链上的属性
const obj = { a: 1, b: 2, c: 3 };
for (let key in obj) {
console.log(key, obj[key]);
}
三、for...of
for…of
循环用于遍历可迭代对象的值,如数组、字符串、Set等。
const array = [1, 2, 3, 4, 5];
for (let item of array) {
console.log(item);
}
四、forEach
forEach
方法是数组的内置方法,提供了一种简洁的方式来遍历和处理数组。可以使用回调函数对每个元素进行特定操作。无法中断或跳出循环。
const array = [1, 2, 3, 4, 5];
array.forEach((item) => {
console.log(item);
});
五、filter
filter
方法是数组的内置方法,用于根据指定条件筛选出符合条件的元素,返回一个新的数组。无法中断或跳出循环。
const array = [1, 2, 3, 4, 5];
const filteredArray = array.filter((item) => {
return item > 2;
});
console.log(filteredArray); // [3, 4, 5]
六、map
map
方法是数组的内置方法,用于根据指定条件对数组的每个元素进行操作,返回一个新的数组。无法中断或跳出循环。
const array = [1, 2, 3, 4, 5];
const mappedArray = array.map((item) => {
return item * 2;
});
console.log(mappedArray); // [2, 4, 6, 8, 10]
七、some
some
方法是数组的内置方法,用于判断数组中是否存在满足指定条件的元素,只要有一个满足条件即返回true
。无法中断或跳出循环。
const array = [1, 2, 3, 4, 5];
const hasEvenNumber = array.some((item) => {
return item % 2 === 0;
});
console.log(hasEvenNumber); // true
八、every
every
方法是数组的内置方法,用于判断数组中的所有元素是否都满足指定条件,只有全部满足条件才返回true
。无法中断或跳出循环。
const array = [1, 2, 3, 4, 5];
const allEvenNumbers = array.every((item) => {
return item % 2 === 0;
});
console.log(allEvenNumbers); // false
九、reduce 与 reduceRight
reduce()
方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。(不改变原数组)
reduceRight()
方法,和reduce()
功能是一样的,它是从数组的末尾处向前开始计算。(不改变原数组)
// reduce()
let arr = [1,2,3];
let ad = arr.reduce(function(i,j,arr){
return i+j;
}) // 6
// reduceRight()
let arr = [1,2,3];
let ad = arr.reduceRight(function(i,j){
return i+j;
}) // 6
十、while
while
循环会在指定条件为真时循环执行代码块。
如果忘记增加条件中所用变量的值,该循环永远不会结束。这可能导致浏览器崩溃
while (条件)
{
需要执行的代码
}
cars=["BMW","Volvo","Saab","Ford"];
var i=0;
while (cars[i])
{
console.log(cars[i] + "<br>")
i++;
};
十一、do while
do/while
循环是while
循环的变体。该循环会在检查条件是否为真之前执行一次代码块,然后如果条件为真的话,就会重复这个循环。
别忘记增加条件中所用变量的值,否则循环永远不会结束!
do
{
需要执行的代码
}
while (条件);
let i = 3;
do{
console.log(i)
i--;
}
while(i>0)
// 3
// 2
// 1
总结
各循环适用场景
选择适当的循环方式和数组方法取决于具体的需求和数据类型。
- 如果需要对数组进行灵活的遍历和处理,可以使用
for
循环、for…in
循环、for…of
循环或forEach
。考虑到性能问题,在数据量小的时候使用函数式编程forEach
,循环遍历操作数据更方便 ,数据量比较大量级时使用for
- 如果需要根据条件筛选数组元素,可以使用
filter
方法; - 如果需要对数组元素进行操作并返回新数组,可以使用
map
方法; - 如果需要判断数组中是否存在满足条件的元素,可以使用
some
方法; - 如果需要判断数组中的所有元素是否都满足条件,可以使用
every
方法。
循环的性能和效率
for > while > forEach > for of > map > for in
- 因为各个方法作用不同,简单的对所有涉及到循环的方法进行执行速度比较,是不公平的,也是毫无意义的。
- 抛开业务场景和使用便利性,单纯谈性能和效率是没有意义的,在实际项目中,不能只考虑性能与简洁,代码的可读性有时比性能更重要