函数柯里化的实现过程及隐式转化。

实现一个函数add(1)(2)

一想,这不是很简单。

function add(num){
    let sum = num;
    return function(num){
      return sum+num
    }
  }
console.log(add(1)(2));

然后又问,如何实现add(1)(2)(3)…
总不能无限嵌套下去吧。
于是,就想到了返回一个函数名,在函数内部判断是否还有参数传进来

 function add(num){
    let sum =num;
    return adds = function (num1){
     
      if(num1) {
        sum = sum+num1;
        return adds
      }
      else return sum
    }
  }
console.log(add(1)(2)(3)());

嗯。一运行完美解决了问题。
这时候又来了一个问题,
add(1,2,3)(2,1)(3)(2,1,3)
在这里插入图片描述
因为现在每次调用传入的参数是不定长的。所以并不能直接把形参给写死。
这时候arguments(需要调用array.from()将参数转化为数组)或者…rest就有了用处了。
代码如下:

  function add(...rest){
          let params = rest; //收集参数
        
          let getparams = function(...rest){
              if(rest.length == 0) return params.reduce((pre,now) => pre+now,0) //当传入的参数为空时,对参数数组遍历求和。
              params.push(...arguments);//收集参数
              return getparams;
          }
         
        return getparams  //重复调用,直到传入参数为空
      }
      let a = add(1,2)(2,1)(3)();
        console.log(a);

还有另一种写法如下

 // function add() {
        //     let _args = Array.from(arguments);
        //     var _adder = function () {
        //         console.log("我被执行了");
        //         _args.push(...arguments);
        //         return _adder;
        //     };
        //     _adder.toString = function () {
        //         console.log("我是tostring");
        //         return _args.reduce((pre, now) => {
        //             return pre + now;
        //         }, 0);
        //     };//重写tostring
        //     return _adder;
        // }
        // let a = add(1,2)(2,1)(3);
        // console.log(+a);//触发隐式转化函数

思路差不多都是一样的,只不过在遍历数组进行求和的方式不一样,所以导致调用的方式不一样,上一种是通过参数是否为空实现遍历,后面是通过隐式转换。

隐式转换:valueOf方法和toString方法被重写过,则会根据valueOf返回的数据类型(基本数据类型则不)判断是否执行toString。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值