Различайте число переданных аргументов: при двух сразу возвращайте сумму, при одном — функцию, ожидающую второй.
Напишите функцию, которая считает сумму двух чисел двумя способами: 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 ошибочно отвергла бы ноль. В этом контракте принимаются конечные числа; вызовы без аргументов и с лишними аргументами отклоняются.