4. 手写Each

/*each
    * _each:遍历数组、类数组、对象中的每一项 
    *   @params
    *     obj:需要迭代的数组、类数组、普通对象
    *     callback:回调函数(每遍历数组中的某一项,就会把回调函数执行一次;而且需要把当前遍历的内容和索引[属性值和属性名]传给回调函数;接收回调函数的返回结果,如果是false,则结束当前的循环,如果是其它值,让返回的值替换数组中的当前项,如果没有返回值,则什么都不处理...)
    *     context:传递的第三个参数,可以改变回调函数中的THIS指向,不传递默认是window
    *   @return
    *     返回一个新的数组或者对象(原来的数组或者对象不变)
*/
function _each(obj, callback, context = window) {
    let isLikeArray = _type.isArray(obj) || (('length' in obj) && _type.isNumeric(obj.length));
    typeof callback !== "function" ? callback = Function.prototype : null;

    //=>数组或者类数组
    if (isLikeArray) {
        let arr = [...obj];
        for (let i = 0; i < arr.length; i++) {
            let item = arr[i],
                result = callback.call(context, item, i);
            if (result === false) break;
            if (typeof result === "undefined") continue;
            arr[i] = result;
        }
        return arr;
    }

    //=>对象的处理
    let opp = {
        ...obj
    };
    for (let key in opp) {
        if (!opp.hasOwnProperty(key)) break;
        let value = opp[key],
            result = callback.call(context, value, key);
        if (result === false) break;
        if (typeof result === "undefined") continue;
        opp[key] = result;
    }
    return opp;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容