for是编程式
for(let i=0;i<arr.length;i++){
console.log(arr[i]);
}
forEach和map
看一看MDN上对Map和ForEach的定义:
forEach(): 针对每一个元素执行提供的函数。
map(): 创建一个新的数组,其中每一个元素由调用数组中的每一个元素执行提供的函数得来。
共同点:
1.都是循环遍历数组中的每一项。
2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input。
3.匿名函数中的this都是指Window。
4.只能遍历数组。
核心要点
1.map()会分配内存空间存储新数组并返回,forEach()不会返回数据
2.forEach()允许callback更改原始数组的元素。map()返回新的数组
let arr = [1, 2, 3, 4, 5];
let doubled=arr.forEach((num, index) => {
return arr[index] = num * 2;
});
console.log(doubled);//undefined
console.log(arr);// [2, 4, 6, 8, 10]
let arr = [1, 2, 3, 4, 5];
let doubled=arr.map((num, index) => {
return arr[index] = num * 2;
});
console.log(doubled);// [2, 4, 6, 8, 10]
console.log(arr);// [2, 4, 6, 8, 10]
map()的执行速度比forEach()快,jsPref是一个非常好的网站用来比较不同的JavaScript函数的执行速度。
forEach适合于你并不打算改变数据的时候,而只是想用数据做一些事情 – 比如存入数据库或则打印出来。
map()适用于你要改变数据值的时候。不仅仅在于它更快,而且返回一个新的数组。这样的优点在于你可以使用复合(composition)(map(), filter(), reduce()等组合使用)来玩出更多的花样。
注意:不管是forEach还是map在IE6-8下都不兼容(不兼容的情况下在Array.prototype上没有这两个方法),那么需要我们自己封装一个都兼容的方法,代码如下:
for in
1.key会变成字符串(String)类型。
2.包括数组的私有属性也可以打印出来,即循环不仅会遍历数组元素,还会遍历任意其他自定义添加的属性,如,arr上包含自定义属性,arr.b,那这次循环中也会出现此b属性。
let arr=[1,2,3,4,5];
arr.b='100';
for(let key in arr){
debugger
console.log(key);
}
for of
- 可以避免所有 for-in 循环的陷阱
- 不同于 forEach(),可以使用 break, continue 和 return
- 它也支持字符串的遍历 ,for-of 并不适用于处理原有的原生对象(不能遍历对象)
for(let val of arr){
console.log(val);
}
filter
let arr=[1,2,3,4,5];
console.log(arr.filter(x=>x))
every()与some()方法都是JS中数组的迭代方法。
共同点:
1.遍历数组;
2. 三个参数分别是item,index,arr(数组具体项,位置,数字本身);
3.返回的都是布尔值;
区别:
1.every()方法,遍历数组每一项,若全部为true,则返回true;
2.some()方法,遍历数组的每一项,若其中一项为 true,则返回true;