Напишите функцию, которая считает сумму двух чисел двумя способами: sum(2, 5) и sum(2)(5). Максимум два аргумента.

Различайте число переданных аргументов: при двух сразу возвращайте сумму, при одном — функцию, ожидающую второй.

Короткий ответ

Что ответить на собеседовании

Различайте число переданных аргументов: при двух сразу возвращайте сумму, при одном — функцию, ожидающую второй.

Подробный разбор

Ответ с пояснениями

Различайте число переданных аргументов: при двух сразу возвращайте сумму, при одном — функцию, ожидающую второй.

function sum(a, b) {
  const valid = value => typeof value === 'number' && Number.isFinite(value);
  if (!valid(a)) throw new TypeError('Ожидалось число');
  if (arguments.length === 1) {
    return function (next) {
      if (arguments.length !== 1 || !valid(next)) throw new TypeError('Ожидалось одно число');
      return a + next;
    };
  }
  if (arguments.length !== 2 || !valid(b)) throw new TypeError('Ожидались два числа');
  return a + b;
}

Проверка по truthiness b ошибочно отвергла бы ноль. В этом контракте принимаются конечные числа; вызовы без аргументов и с лишними аргументами отклоняются.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее