函数柯里化实现多个类型判断封装

目的

  • 理解函数柯里化
  • 利用柯里化简化类型判断代码

先实现一个通用的类型检测方法

function isType(typeing, val) {
  return Object.prototype.toString.call(val) === `[object ${typeing}]`;
}

再看一下柯里化函数的使用方式

假如我们有个求和函数,

function add(a,b,c,d,e){
    return a+b+c+d+e
}

并且可以用下面的方式调用
Currying(add)(1)(2,3)(4,5)

从上面的调用方式可以看到
– Currying 函数返回的是函数,直到调用最后一次返回结果
– 参数被缓存起来了,可以在下一个函数调用时使用

最重要的如何实现currying函数

最重要的如何实现currying函数

const currying = (fn, ...args) => {
  let length = fn.length;
  return (...userArgs) => {
    args = args.concat(userArgs);
    return args.length >= length ? fn(...args) : currying(fn, ...args);
  };
};
  • 上面args放在currying函数参数里利用闭包缓存起来
  • length变量保存最后要执行的函数的需要的参数个数
  • 在每次调用后保存到目前为止传入的参数,在传入的参数个数大于等于需要的参数个数时执行fn,就是我们最终完成需求的函数
  • 参数个数没有达到要求时,仍然返回一个函数用于之后接着调用

最后

const types = ["String", "Number", "Boolean", "Array"];
let utils = {};
types.forEach((type) => {
utils[`is${type}`] = Currying(isType)(type);
});
console.log(utils.isString("11"));
console.log(utils.isNumber(11));

这样utils里面就有了数组 types里的各种类型判断的函数。代码少了一大推

发表评论

您的电子邮箱地址不会被公开。