手动实现一个类似 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;
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

dmq 微信支付

微信支付

dmq 支付宝

支付宝