高阶函数是个什么?

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

 

常用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)
}

 

posted on 2021-03-12 00:17  执候  阅读(177)  评论(0编辑  收藏  举报