По-разному передавая аргументы, функция должна вывести то же значение - PullRequest
2 голосов
/ 29 января 2020

Можно ли как-нибудь написать функцию, чтобы при ее вызове даже путем передачи аргументов по-разному она по-прежнему выводила одно и то же значение

Я новичок в JavaScript, и мне недавно был задан этот вопрос в интервью -

Напишите функциональную сумму, которая при вызове, например, sum (2) (3) или sum (2, 3), должна возвращать 5.

Это может будет выполняться индивидуально следующим образом:

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

или

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

Если я буду следовать первому коду, он не выполнит сумму (a, b) и, конечно, второй код не будет сумма поддержки (а) (б). Можно ли как-то объединить два фрагмента кода, чтобы он выполнялся, независимо от того, как я его называю?

Ответы [ 2 ]

1 голос
/ 29 января 2020

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, то вы возвращаете функцию. Если это не так, вы возвращаете сумму чисел.

Конечно, вы также можете проверить, что оба аргумента являются числами, но это простая версия для иллюстрации того, что вы хотите.

1 голос
/ 29 января 2020

Вам нужно проверить, сколько аргументов было передано. Если два переданы, вернуть добавленные значения; в противном случае возвращает функцию, которая при вызове возвращает свой аргумент плюс аргумент замыкания:

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));
...