源码分析

一、call和apply
myCall实现call效果

    Function.prototype.myCall=function(){
    	var ctx=arguments[0]||window;
    	ctx.fn=this;
    	var args=[];
    	var len=arguments.length;
    	for(var i=1;i<len;i++){
    		args.push('arguments['+i+']');
    	}
    	var result=eval('ctx.fn('+args.join(',')+')');
    	return result;
    }

myApply实现apply效果

Function.prototype.myApply = function (ctx, arr) {
            ctx = ctx || window;
            ctx.fn = this;
            var result;
            if (arr) {
                var args = [];
                for (var i = 0; i < arr.length; i++) {
                    args.push('arr[' + i + ']');
                }
                result = eval('ctx.fn(' + args.join(',') + ')');
            } else {
                result = ctx.fn();
            }
            delete ctx.fn;
            return result;
        }

二、map和 reduce
selfMap实现map效果

Array.prototype.selfMap = function () {
		  const ary = this
		  const result = []
		  const [ fn, thisArg ] = [].slice.call(arguments)
		  if (typeof fn !== 'function') {
			throw new TypeError(fn + 'is not a function')  
		  }
		  for (let i = 0; i < ary.length; i++) {
			result.push(fn.call(this, ary[i]))
		  }
		  return result
		}
		const a = new Array(1, 2, 3, 4,5);
		console.log(a.selfMap(item => item *2));

selfReduce实现reduce效果

Array.prototype.selfReduce= function (fn,init) {
		  var len=this.length;
		  var pre=init;
		  var i=0;
		  if(init==undefined){
			pre=this[0];
			i=1;
		  }
		  for(i;i<len;i++){
			pre=fn.call(pre,this[i]);
		  }
		  return pre;
		}
		const b = new Array(1, 2, 3, 4,5);
		console.log(b.selfReduce((preTotal,ele)=>preTotal+ele));

三、reduce实现map和filter
reduce实现map

const reduceMap=(fn,thisArg)=>{
			return (list)=>{
				if(typeof fn!=="function"){
					throw new TypeError(fn+'is not a function');
				}
				if(!Array.isArray(list)){
					throw new TypeError('list not be a Array');
				}
				if(list.length==0) return []
				return list.reduce((acc,value,index)=>{
					return acc.concat([fn.call(thisArg,value,index,list)])
				},[]) 
			}
		}
		console.log(reduceMap(x=>x+1)([1,2,3]))

reduce实现filter

const reduceFilter=(fn,thisArg)=>{
			return (list)=>{
				if(typeof fn!=="function"){
					throw new TypeError(fn+'is not a function');
				}
				if(!Array.isArray(list)){
					throw new TypeError('list not be a Array');
				}
				if(list.length==0) return []
				return list.reduce((acc,value,index)=>{
					return fn.call(thisArg,value,index,list)?acc.concat([value]):acc
				},[])
			}
		}
		console.log(reduceFilter(x=>x%2===0)([1,2,3]))
		

文章参考:https://juejin.im/post/5c0b7f03e51d452eec725729

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值