zoukankan      html  css  js  c++  java
  • js高阶函数

    高阶函数是个什么?

    所谓高阶函数,就是函数中可以传入另一个函数作为参数的函数。

    常用js方法封装
    1、forEach
    Array里面forEach是通过Array拓展原型方法实现的Array.prototype.forEach
    下面我就使用两种方式实现forEach封装

    //方法一 
    let arr=[1,3,5,3,6,7,8];
    function forEach(array,fn){
        for(let i=0;i<array.length;i++){
            fn(array[i],i);
        }
    }
    forEach(arr,function(item,index){
        console.log("forEach",item,index);
    })
    
    //方法二 使用原型拓展数组的原型方法
    Array.prototype.myForEach=function(fn){
        console.log(this);//[1, 3, 5, 3,6, 7, 8]
        for(let i=0;i<this.length;i++){
            fn(this[i],i)//前面的是item 后面是index
        }
    }
    arr.myForEach(function(item,index){
        console.log("myForEach",item,index);
    })

     2filter 下面我就使用两种方式实现filter封装

    var arr=[1,2,4,6,7,8];
    //方法一
    let arr=[1,2,4,6,7,8];
    function filter(array,fn){
        let result=[];
        for(let i=0;i<array.length;i++){
            if(fn(array[i],i)){
                result.push(array[i])
            }
        }
        return result;
    }
    var r=filter(arr,function(item,index){
        return item%4===0
    })
    console.log(r); //[ 4, 8 ]
    //方法二
    Array.prototype.myFilter=function(fn){
        console.log(this);
        let result=[];
        for(let i=0;i<this.length;i++){
            if(fn(this[i],i)){
                result.push(this[i])
            }
        }
        return result;
    }
    
    var s=arr.myFilter(function(item){
        return item%3===0
    })
    console.log(s)//[ 6 ]

    map 

    let arr=[2,4,5,6,7]
    //方法一
    function map(array,fn){
        var result=[];
        for(let value of array){
            result.push(fn(value))
        }
        return result
    }
    let aa=map(arr,function(item){
        return item+1;
    })
    console.log(aa); //[ 3, 5, 6, 7, 8 ]
    //方法二
    Array.prototype.mymap=function(fn){
        var result=[];
        console.log(this);
        for(let value of this){
            result.push(fn(value))
        }
        return result;
    }
    bb=arr.mymap(function(item){
        return item+1;
    })
    console.log(bb); //[ 3, 5, 6, 7, 8 ]

     every 每一样都是true

    let arr=[2,4,5,6,7]
    //方法一
    function every(array,fn){
        let result=true;
        for(let value of array){
            result=fn(value);
            if(!result){
                break;
            }
        }
        return result
    }
    let aa=every(arr,function(item){
        return item>1
    })
    console.log(aa);//true
    //方法二
    Array.prototype.myEvery=function(fn){
        let result=true;
        for(let value of this){
            result=fn(value);
            if(!result){
                break;
            }
        }
        return result;
    }
    let mapArr=arr.every(function(item){
        return item>0;
    })
    console.log("mapArr",mapArr);//true

    some 有一项为true即可

    let arr=[2,4,5,6,7]
    //方法一
    function some(array,fn){
        let result=false;
        for(let value of array){
            result=fn(value);
            if(result){
                break;
            }
        }
        return result
    }
    let aa=some(arr,function(item){
        return item>7
    })
    console.log(aa);//false
    //方法二
    Array.prototype.mySome=function(fn){
        let result=false;
        for(let value of this){
            //调用fn检测值是否满足
            result=fn(value);
            if(result){
                break;
            }
        }
        return result;
    }
    let someArr=arr.mySome(function(item){
        return item>=7;
    })
    console.log("someArr",someArr);//true

    once 函数只执行一次,这里使用了我们常见的闭包
    一个函数调用另一个函数的局部变量这就是闭包
    闭包的本质:函数在执行的时候会放在一个执行栈上,当函数执行完毕执候会从执行栈上移除,但是堆上的作用成员因为被外部引用不能释放,因此内部函数依然可以访问外部函数的成员

    
    
    //高阶函数函数最为返回值
    function once(fn){
    let done=false;
    return function(){
        if(!done){
            done=true;
            return fn.apply(this,arguments)
        }  
    }        
    }
    
    let one=once(function(item){
    console.log(item);
    })
    one(2) //只会打印2
    one(3)

    uniqu 数组去重

    const arr=[2,3,5,4,2];
    //方法一 ES6
    function unique(array){
      return [...new Set(array)]
    }
    //方法二 使用indexOf()
    function unique(array){
      if(!Array.isArray(array)){
        return false;
      }
      var result=[];
      for(let i=0;i<array.length;i++){
        if(result.indexOf(array[i])==-1){
          result.push(array[i])
        }
      }
      return result;
    }
    //方法三 双指针
    function unique(array){
      for(var i=0;i<array.length;i++){
        for(var j=i+1;j<array.length;j++){
          if(array[i]==array[j]){
            array.splice(j,1);
            j--;
          }
        }
      }
      return array;
    }
    //方法四 
    function unique(array){
      var obj={};
      return arr.filter(ele=>{
        if(!obj[ele]){
          obj[ele]=true;
          return true;
        }
      })
    }
    c=unique(arr)

    判断数据返回类型

    // typeof 遇到null,数组,对象 只会返回Object
    //instanceof用于判断一个变量是否某个对象的实例
    function type(params) {
        return Object.prototype.toString.call(params)
    }
    日常所遇,随手而记。
  • 相关阅读:
    17多校6 HDU
    E. Present for Vitalik the Philatelist 反演+容斥
    HDU
    F. Cowmpany Cowmpensation dp+拉格朗日插值
    hdu6088 组合数+反演+拆系数fft
    任意模数fft
    Codeforces Round #258 (Div. 2)E
    bzoj3670: [Noi2014]动物园
    HDU
    IO-InputStreamReader
  • 原文地址:https://www.cnblogs.com/zhihou/p/14509084.html
Copyright © 2011-2022 走看看