forEach,map,filter,reduce,indexof兼容旧浏览器

思路:判断Array的原型对象里是否有该api,没有则添加此api
代码如下:

var arr=[2,,4,5]
 if(typeof Array.prototype.forEach!=="function"){
            Array.prototype.forEach=function(fn){
                for(var i=0;i<this.length;i++){  
                    if(this[i]!==undefined) //防止稀疏数组
                    fn(this[i],i,this)
                }
            }
        }
            arr.forEach(function(elem,i,arr){
                arr[i]=elem*2;
        })
        document.write(arr)

解析:fn是一个回调函数,通过for循环把当前的元素,位置,数组作为fn的参数,fn可以获得来调用forEach的数组的当前位置和元素,然后我们调用forEach的时候,又写了回调函数fn里面执行的代码(这里是执行了elem*2,然后把结果又赋值给当前元素,所以直接修改了原数组)

map的原理,代码如下,因为和forEach差不多,不陈述了

 if(typeof Array.prototype.map!=="function"){
            Array.prototype.map=function(fn){
                var arr=[];
                for(var i=0;i<this.length;i++){
                    if(this[i]!==undefined)
                   arr[i]=fn(this[i],i,this)
                }
                return arr;
            }
        }
        var newArr=arr.map(function(elem,i,arr){
            return elem*2
        });

filter的原理代码如下

  var arr=[2,3,4,5]
        //筛选偶数出来,返回新数组,不改变原数组
        if(typeof Array.prototype.my_filter!=="function"){
            Array.prototype.my_filter=function(fn){
                var arr=[]
                for(var i=0;i<this.length;i++){
                 
                    fn(this[i],i,this)&&arr.push(this[i])
                }
                return arr;
            }
        }
        var new_arr=arr.my_filter(function(elem,i,arr){
            return elem%2==0;
        })
        console.log(new_arr)

reduce的原理,代码如下

var arr1=[1,2,3]
  if(typeof Array.prototype.my_reduce!=="function"){
            Array.prototype.my_reduce=function(fn,base){
                base===undefined&&(base=0)
                var prev=base;
                for(var i=0;i<this.length;i++){                  
                    prev=fn(prev,this[i],i,this);
                }
               return prev;
            }
        }

        var a=arr1.my_reduce(function(prev,elem,i,arr){
            return prev+elem;
        },100)
        console.log(a)//106

这个需要解析,比前面的稍难理解,首先要明白prev是什么,prev是指当前的汇总和,包含了第二个参数,不包含当前元素。因为每次和当前元素相加完马上覆盖了之前的prev,所以最终相当于第二个参数加上整个数组的和

下面是indexof的代码原理

  //判断浏览器是否有api  indexOf
            if(typeof Array.prototype.indexOf!=="function"){
                    //没有该api则为原型对象添加该api                
                Array.prototype.indexOf=function(elem,fromi=0){
                    //fromi==undefined&&(fromi=0);
                    //this指将来调用该api的.前的子对象
                    for(var i=fromi;i<this.length;i++){
                        if(this[i]==elem) return i;
                    }
                    return -1;
                }
            }

猜你喜欢

转载自blog.csdn.net/weixin_44494811/article/details/87807436
今日推荐