> Как избежать конкатенации чисел как строк в функции суммы аргументов в JavaScript? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Газпромбанк
Стек: JavaScript
> Пример ответа
Проблема возникает, когда в функцию суммы передаются аргументы, которые JavaScript интерпретирует как строки, и оператор + выполняет конкатенацию вместо сложения. Чтобы избежать этого, нужно явно преобразовывать аргументы в числа перед суммированием.
Вот пример функции, которая корректно суммирует любые переданные аргументы, независимо от их типа:
JAVASCRIPTfunction sum(...args) {return args.reduce((acc, val) => {const num = Number(val);// Проверяем, является ли значение числом (включая 0)if (!isNaN(num) && val !== null && val !== '') {return acc + num;}// Если преобразование не удалось, можно выбросить ошибку или проигнорировать// В данном случае игнорируем нечисловые значенияreturn acc;}, 0);}// Примеры использования:console.log(sum(1, '2', 3)); // 6console.log(sum('10', '20', 30)); // 60console.log(sum(1, 'abc', 2)); // 3 (игнорируем 'abc')
Ключевые моменты:
- Используем
Number(val)для приведения каждого аргумента к числу. - Проверяем результат через
isNaN(), чтобы отсеять нечисловые значения (например,'abc'илиundefined). - Обрабатываем краевые случаи:
nullи пустую строку'', так какNumber(null)даёт 0, аNumber('')- 0, что может быть нежелательно.
Альтернативно, если нужно строго требовать числа и выбрасывать ошибку при невалидных данных:
JAVASCRIPTfunction sumStrict(...args) {return args.reduce((acc, val) => {const num = Number(val);if (isNaN(num) || val === null || val === '') {throw new TypeError(`Invalid number: ${val}`);}return acc + num;}, 0);}
Таким образом, явное преобразование типов и проверка isNaN решают проблему конкатенации строк.
> Похожие задачи по frontend
В чем разница между document.getElementsByClassName и querySelectorAll в JavaScript
Как реализовать функцию memo для кеширования результатов вызовов по аргументам в JavaScript
Как реализовать бесконечный скролл
Как создать и выполнить промис через конструктор в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью