sum(2)(3)(4)函数

2,346 阅读1分钟
终极答案

function add() {
  let args = [...arguments] 
  let fn = function () { 
    args.push(...arguments) 
    return fn 
  } 
  fn.toString = function () { 
    return args.reduce((x,y) => x+y) 
  } 
  return fn 
}

toString和valueOf的类型转换

//案例1
//sum(2,3)和sum(2)(3)均能输出outPut5,这个问题较为简单,只要返回一个函数即可,本例中使用了es6语法
function sum(x = 0, y) {
  if ([...arguments][1] == undefined) {
    let befor = [...arguments][0];
    return function suum(afte) {
      let sum2 = befor + afte;
      console.log(`outPut${sum2}`);
    }
  } else {
    let sum1 = x + y;
    console.log(`outPut${sum1}`);
  }
}

sum(2, 3); //输出outPut5
sum(2)(3); //输出outPut5

//案例二、add(2,3,4...)和add(2)(3)(4)...都输出相同结果的解决方案

function add(x) {
  var sum = x;
  var tmp = function (y) {
    sum = sum + y;
    return tmp;
  };
  tmp.toString = function () {
    return sum;
  };
  return tmp;
}
console.log(add(1)(2)(3)); //6
console.log(add(1)(2)(3)(4)); //10
console.log(add(1)(2)(3)(4)(5)); //15
console.log(add(1)(2)(3)(4)(5)(6)); //21

//扩展案例3、此函数使用es6实现输入sum(),sum(2,3,4...)多个值相加,还有sum(2)(3)(4)...等多个数值分别相加的值相等,此案例也是最完整的解决方案
function sum(...args) {
  if ([...args].length == 1) {
    let sum2 = [...args][0];
    var suum = function (y) {
      sum2 += y;
      console.log(`output ${sum2}`)
      return suum;
    }
    suum.valueOf = function () {
      return sum2;
    }
    return suum;
  } else {
    let sum1 = 0;
    for (var i = 0; i < [...args].length; i++) {
      sum1 += [...args][i];
    }
    return sum1
  }
}
//sum(1); //outPut1 0
//sum(2, 3, 4); //outPut1 9
//sum(2)(3)(4)(5); //outPut1 5//outPut1 9//outPut1 14
//每加一次就会输出一次Sum。如果不想输出三次则可以在函数中加一个valueOf方法或者toString方法。然后将Summ函数中的console去掉。
//然后console.log(sum(2)(3)(4)(5));即可
console.log(sum(2)(3)(4)(5))
console.log(sum(2))