以不同方式传递参数,函数仍应输出相同的值

Passing arguments differently, function should still output the same value

有什么方法可以编写函数,以便在调用它时即使通过不同的参数传递,它仍然输出相同的值

我是 JavaScript 的新手,最近在一次采访中被问到这个问题 -

Write a function sum which when called like sum(2)(3) or sum(2, 3) should return 5.

这可以单独完成,如下所示

function sum(a){
  return function(b){
    return a+b
  }
}

function sum(a, b){
  return a+b
}

如果我按照第一个代码,它不会执行sum(a, b),当然第二个代码也不支持sum(a)(b)。有什么方法可以合并这两个代码片段,这样无论我怎么称呼它都可以执行吗?

您需要检查传递了多少参数。如果两个都通过了,return 相加的值;否则,return 一个函数,当被调用时,return 是它的参数加上闭包的参数:

const sum = (...args) => {
  if (args.length === 2) {
    return args[0] + args[1];
  }
  return arg => arg + args[0];
};

console.log(sum(2)(3));
console.log(sum(2, 3));

更一般地说,您可以创建一个 makeSum 函数来处理要接受的参数总数是任意数字的情况:

const makeSum = totalArgCount => {
  const fn = (...args) => {
    if (args.length === totalArgCount) {
      return args.reduce((a, b) => a + b, 0);
    }
    return fn.bind(undefined, ...args);
  };
  return fn;
};

const sum2 = makeSum(2);
console.log(sum2(2)(3));
console.log(sum2(2, 3));

const sum4 = makeSum(4);
console.log(sum4(2)(3)(4)(5));
console.log(sum4(2, 3, 4)(5));

function sum(a, b) {
  return b !== undefined ? (a + b) : function(b) { return a + b; }
}

console.log(sum(1,2));
console.log(sum(1)(3));

您可以这样做,方法是检查 b 参数。如果是undefined,那么你return一个函数。如果不是,你 return 数字的总和。

当然你也可以检查两个参数都是数字,但这是一个简单的版本来说明你想要什么。