总结持续精进之js方法重写

303 阅读1分钟

一.手写一个forEach函数

function forEach(array, fn) {
  for (let i = 0; i < array.length; i++) {
    fn(array[i]);
  }
}

二.手写一个filter函数

function filter(array, fn) {
  let result = [];
  for (let i = 0; i < array.length; i++) {
    if (fn(array[i])) {
      result.push(array[i]);
    }
  }
  return result;
}

三.手写一个once函数(也就是函数只能调用一次)

function once(fn) {
  let done = false;
  return function () {
    if (!done) {
      done = true;
      return fn.apply(this, arguments);
    }
  };
}

四.手写一个map函数

const map = (array, fn) => {
  let result = [];
  for (let value of array) {
    result.push(fn(value));
  }
  return result;
};

五.手写一个every函数

const every=(array,fn)=>{
    let result=true;
    for(let value of array){
        result=fn(value);
        if(!result){
            break;
        }
    }
    return result;
}

六.手写一个some函数

const some=(array,fn)=>{
let result=true;
for(let value of array){
    result=fn(value);
    if(result){
        break;
    }
}
return result;
}
  

七.闭包的应用

7.1实现一个数字的平方
function makepow(power){//平方次数
    return function(number){//数字
        return Math.pow(number,power)
    }
}
7.2实现计算公司总工资
function makeSalary(base){//基本工资
    return function(performance){//绩效工资
        return base + performance;//总工资
    }
}

八.模拟memozie 缓存函数

function memoize(f){
  let cache={}
  return function(){
    let key =JSON.stringify(arguments);
    cache[key]=cache[key] || f.apply(f,arguments);
    return cache[key]
  }
}
function getArea(r){
  console.log(r);
  return Math.PI * r * r; 
}
let getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));
console.log(getAreaWithMemory(4));

九.函数柯里化

 function curry(func){
  return function curriedFn(...args){
    //判断实参形参的个数
    if(args.length < func.length){
      return function(){
        return curriedFn(...args.concat(Array.from(arguments)));
      }
    }
    return func(...args)
  }
}
function getSum(a,b,c){
  return a+b+c;
}
const curried=curry((getSum));
console.log(curried(1,2,3));
console.log(curried(1)(2,3));
console.log(curried(1,2)(3));

十.组合函数

function compose (...args){//组合函数 从右到左依次调用
   return function(value){
    return args.reverse().reduce(function(acc,fun){//把前一个函数执行完的结果传给第2个
       return fun(acc)
     },value)
  }
 }
const compose=(...args)=>value=>args.reverse().reduce((acc,fun)=>fun(acc),value);
const reverse=arr=>arr.reverse();
const first=arr=>arr[0]
const toUpper=s=>s.toUpperCase();
const f=compose(toUpper,first,reverse);
console.log(f(['one','two','three']));