手动实现一个类似 forEach 的效果:
前端开发过程中经常会遇到使用 forEach 的场景,那么它的原理究竟是什么呢?下面我手动写了一个类似的效果,不同的是函数可能会改变原始值.
代码如下:
function myEach(obj,fn,context=window){ | |
// 类型判断 | |
if(typeof obj !== 'object'){ | |
throw ('必须要是对象') | |
} | |
if(obj === null){ | |
throw ('必要不为空对象') | |
} | |
if(typeof fn !== 'function'){ | |
throw ('第二个参数,必须要是函数') | |
} | |
// 如果是数组 | |
if(isArrayLike(obj)){ | |
for(let i=0;i<obj.length;i++){ | |
let res = fn.call(context,obj[i],i); | |
//res 为什么会为 false(如果函数内部 return 了,那么这里就需要跳出循环) | |
if(res===false){ | |
break; | |
} | |
// 如果返回值不是 undefined, 有返回值,就替换掉这一项 | |
if(res !== undefined){ | |
obj[i] = res; | |
} | |
} | |
}else{ | |
// 如果是对象 | |
for(let key in obj){ | |
if(!obj.hasOwnProperty(key)) break; | |
const res = fn.call(context,obj[key],key); | |
if(res ===false){ | |
break; | |
} | |
if(res !==undefined){ | |
obj[key] = res; | |
} | |
} | |
} | |
return obj; | |
} |