循环数组的方法
循环列表:
1、for循环
2、for in循环
3、for of循环
4、for Each循环
5、while 循环
6、do while循环
7、map循环
8、filter循环
9、some循环
10、every循环
11、reduce循环
12、reduceRight循环
优化版的for循环
forEach变种
for循环是最普通的一个循环了,一般都是用for循环
let arr = ['1','2','3']
for (let i = 0; i < arr.length; i++) {
console.log(i,arr[i] + 1)
}
//打印出来的i是他每一个的下标,arr[i]就是他的每一项。
// 0 "11"
// 1 "21"
// 2 "31"
for in循环可以循环对象,也可以循环数组。用for in 循环的时候,他会找到prototype上去,所以最好在循环体内写一个判断,用obj[i].hasOwnProperty(i),这样就避免遍历出太多不需要的属性。
let arr = ['1','2','3'];
let objDq = {a:1,b:2,c:3};
// 循环对象
for (let i in objDq) {
console.log(i,objDq[i])
}
// i代表键,objDq[i]代表值
// a 1
// b 2
// c 3
// 循环数组
let arr = ['1','2','3'];
for (let i in arr) {
console.log(i,arr[i])
}
// i代表下标,arr[i]代表每一项
// 0 '1'
// 1 '2'
// 2 '3'
fo of 循环功能特别强大(es6新增),可以代替for in循环和fo Each循环,而且还可以遍历类数组对象
// 类数组对象
let obj = { 10: 'a', 2: 'b', 7: 'c' }
for (let i of arr) {
console.log(i)
}
// i就是它的每一项,如果打印arr[i],我打印出来第三个值是undefined。
for Each循环,他接受三个参数,但是只有第一个是必须有的。注意,用forEach循环在元素没有遍历完之前是不会停止的,没有break语句,可以用try catch语句,就是在要强制退出的时候,抛出一个 error 给 catch 捕捉到,然后在 catch 里面 return,这样就能中止循环了。
arr.forEach(function (i,n,m) {
console.log(i,n,m)
})
// i代表数组的每一项,n代表每一项的下标,m是原数组
// 1 0 (3) ["1", "2", "3"]
// 2 1 (3) ["1", "2", "3"]
// 3 2 (3) ["1", "2", "3"]
while循环
let arr = ['1','2','3'];
var objCc = 0;
while (arr[objCc]) {
console.log(arr[objCc]);
// 一定加这个要不就是死循环,电脑直接卡死
break
}
和for循环一样,只不过这个写的比较麻烦,for循环比这个简单。
do while 循环是 while 循环的一个变体,它首先执行一次操作,然后才进行条件判断,是 true 的话再继续执行操作,是 false 的话循环结束。
let iSa = 3;
do{
console.log(iSa)
iSa--;
}
while(iSa>0)
// 打印的就是3,2,1
map循环,map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。map 和 forEach 方法都是只能用来遍历数组,不能用来遍历普通对象。
let arr = [1,2,3];
arr.map(function(i,n,m){
console.log(i,n,m)
return i*2;
})
// i代表每一项,n代表下标,m代表以前的数组
// 1 0 (3) [1, 2, 3]
// 2 1 (3) [1, 2, 3]
// 3 2 (3) [1, 2, 3]
filter循环是 Array 对象内置方法,它会返回通过过滤的元素,不改变原来的数组。
let arr = [1,2,3];
let arrObf = arr.filter(function(i,n,m){
console.log(i,n,m)
return i>1; //遍历数组中是所有元素返回大于1的元素
})
// i代表每一项,n代表下标,m代表以前的数组
// 1 0 (3) [1, 2, 3]
// 2 1 (3) [1, 2, 3]
// 3 2 (3) [1, 2, 3]
console.log(arrObf)
// 打印的是 [2, 3]
some方法用于检测数组中的元素(只要有一个满足条件就是true)是否满足指定条件(函数提供),返回 boolean 值,不改变原数组。
let arr = [1,2,3];
let arrObf = arr.some(function(i,n,m){
console.log(i,n,m)
// i每一项,n下标,m原数组
// 1 0 (3) [1, 2, 3]
// 2 1 (3) [1, 2, 3]
return i>1;
})
console.log(arrObf)
// 打印出来就是true
every的方法用于检测数组所有元素(或每一个元素都必须满足条件才为true)是否都符合指定条件(通过函数提供),返回 boolean 值,不改变原数组。
let arr = [1,2,3];
let arrObf = arr.every(function(i,n,m){
console.log(i,n,m);
// 1 0 (3) [1, 2, 3],第一个值,下标为0不满足
return i>1;
})
console.log(arrObf)
// 打印出来的就是false
reduce循环方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。接收四个参数
let arr = [1,2,3];
let arrObf = arr.reduce(function(i,n,m,v){
console.log('i'+ i,'n' + n,'m' + m,'v' + v,)
// i1 n2 m1 v1,2,3
// i3 n3 m2 v1,2,3
return i+n;
})
console.log(arrObf);
// 打印出来的就是6
reduceRight循环和 reduce() 功能是一样的,它是从数组的末尾处向前开始计算。也是接收四个参数。
let arr = [1,2,3];
let arrObf = arr. reduceRight(function(i,n,m,v){
console.log('i'+ i,'n' + n,'m' + m,'v' + v);
// i3 n2 m1 v1,2,3
// i4 n1 m0 v1,2,3
return i+m;
})
console.log(arrObf)
// 打印出来的就是4
优化版的for循环,使用临时变量将长度缓存起来,避免重复获取数组长度当数组较大时优化效果才会比较明显,这种方法基本上是所有循环遍历方法中性能最高的一种.
for(i=0,len=arr.length;i<len;i++){
console.log(i,arr[i])
// 0 1
// 1 2
// 2 3
}
forEach变种,因为forEach是Array自带的,对于一些非这种类型的,无法直接使用(如NodeList), 所有才有了这个变种,使用这个变种可以让类似的数组拥有forEach功能。
let arr = [1,2,3];
Array.prototype.forEach.call(arr,function(item,index,arr){
console.log(item,index,arr);
// item是每一项,index是下标,arr是原数组
// 1 0 (3) [1, 2, 3]
// 2 1 (3) [1, 2, 3]
// 3 2 (3) [1, 2, 3]
})
没写的接收几个参数的,默认就接收三个参数,有不对的地方欢迎评论指出,我好修改。