循环方法有很多,但是到底什么场景适合什么方法,今天我们就来简单的剖析一下
1、for循环
- for循环最重要的是有三个表达式:定义变量,判断条件,更新循环变量,三个表达式可以省略,但是分号不能省略。
- for循环的执行的时候是先判断,然后再执行
- 使用场景:
for(let i = 0; i < list.length; i++ ){
console.log(list)
}
2、for-in循环
- for-in循环不仅可以遍历对象自身的属性,也能遍历原型链上的对象的原型属性
- 扩展:可以使用hasOwnProperty判断一个属性是不是对象自身的属性
- 使用场景:主要用于遍历对象。也能遍历字符串和数组(不推荐使用)
- 缺点:1、数组的键名是Number类型,但是使用for-in循环的时候他会将其转化为String类型,2、对象都继承了自其它/Object对象,继承属性的值默认是不可遍历的,但是for循环会遍历,原型链上的属性,我们使用的时候需要注意些。
for(let key in Obj){
console.log(Obj[key])
}
3、for-of循环
- ES6最新引入的,用以遍历所有的数据结构的统一方法
- 如果一个数据结构上只要有Symbol.iterator属性,就被视为具有iterator接口,这类的数据就可以被for…of循环。本质上for…of循环内部调用的是数据结构的Symbol.iterator方法
- 使用场景:包括数组,Set和Map结构,类数组对象(arguments,DOM NodeList对象)Generator 对象,字符串
- 缺点:
for (const iterator of result) {
console.log(iterator);
}
4、forEach循环
- 对数组的所有成员依次执行参数函数,
- 参数函数接收三个参数,当前值,当前序号,原数组
- forEach还接受第二个参数,用来指定参数函数内的this指向
result.forEach((item,index,arr)=>{
console.log(item)
},result)
5、map循环
- 将数组所有成员一次传入参数函数,然后把每次的结果组成一个新数组返回,
- 参数函数接收三个参数,当前值,当前序号,原数组
- 循环的时候会跳过空位
- map还接受第二个参数,用来指定参数函数内的this指向
const result = [1, 2, 3, 4];
let results = result.map((item, index, arr)=>{
return n + 1;
},result);
console.log(results); [2, 3, 4, 5]
6、filter循环
- 用于过滤数组成员,将满足条件的数组成员组合成一个新数组返回,不会改变原数组
- 参数函数接收三个参数,当前值,当前序号,原数组
- 循环的时候会跳过空位
- 还接受第二个参数,用来指定参数函数内的this指向
let results = result.filter((item,index,arr)=>{
console.log(item)
},result)
7、while循环
- while循环要先声明循环变量,设置循环条件,只要条件为真就会一直循环
- 在while循环中,循环条件可以是任何类型,但是最终都会转换为Boolean类型,为真则执行循环,为假则不执行
- 使用场景:
while (condition) {
console.log(condition)
}
8、do…while循环
- 先执行后判断,
do {
console.log(condition)
} while (condition);
9、some(),eveny() 循环遍历统计数是否满足某个条件,
- 将数组的参数传递进参数函数中,参数函数接受三个参数,当前值,当前值位置,原数组
- some():只要有一个是true,则some函数的返回值就是true。否则返回false
- every():所有成员返回true,则every函数返回值就是true,否则返回false
let res = result.some((item, index, arr) => {
return item < 2;
});
let res = result.every((item, index, arr) => {
return item < 2;
});
10、reduce(),reduceRight()方法可依次处理数组的每个成员
- reduce() 和 reduceRight()依次处理数组的每个成员,最终累计为一个值。
- 区别是:reduce正序,reduceRight倒序
- 参数函数接受4个参数:累计变量(必须),当前变量(必须),当前位置,原数组
let res = result.reduce((sum, item, index, result) => {
return sum + item;
});
let res = result.reduceRight((sum, item, index, result) => {
return sum + item;
});