【循环系列】for in和forEach循环

250 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

发现JS中的循环有好多,如果让一下说出来,感觉有些会想不起来,本次花时间来梳理一下JS中循环语句。

本系列相关文章:

本文是本系列第二篇,关于for inforEach循环

for in循环

for in循环大多数情况是用于遍历对象,但是也能遍历数组,由于比较常用,所以也纳入进来

for (let i in arr) {
    console.log(arr[i]);
}

值得注意的是,for in枚举数组是key,后面会讲for of可以直接枚举到数组的value

forEach循环

arr.forEach(function(val, index, arr){
  console.log(val, index, arr);
});

forEach其实就是用于代替普通for循环的,但是用起来比for循环更方便。可以接收两个参数:第一个参数表示每次循环执行的回调函数;第二个参数表示this指向问题。其中回调函数接受三个参数,分别表示与循环圈数对应的value值、数组下标index以及原数组arr

需要注意的是,如果回调函数是箭头函数,那么通过第二个参数修改this执行时不能修改成功的。因为箭头函数this默认是执行外围非箭头函数执行的thiscallapply以及bind是不能修改的。

let arr = [1,2,3,4];
const obj = {name:"alice"}
arr.forEach((val,index,array)=>{
    console.log(this,val,index,array);
    //箭头函数不能通过第二个参数来修改其里头的this指向
},obj);

了解了基本使用,下面来模拟实现_forEach

Array.prototype._forEach = function (fn, thisTo) {
	for (let i = 0; i < this.length; i++) {
		fn.call(thisTo,this[i], i, this);
	}			
}
//test code
let arr = [1,2,3,4];
const obj = {name:"alice"}
arr._forEach(function(val,index,array){
    console.log(this,val,index,array);//正常函数可以通过call来修改this指向
},obj);
arr._forEach((val,index,array)=>{
    console.log(this,val,index,array);//箭头函数不能通过第二个参数来修改其里头的this指向
},obj);

实现成功

结束

以上就是两个循环的相关内容