Как найти сумму элементов массива чисел в JavaScript?
Проблема в вашем коде
Ошибка в вашем цикле — условие i <= numbers.length. Длина массива numbers.length равна 5, но индексы элементов идут от 0 до 4. Когда i становится равным 5, вы пытаетесь обратиться к numbers[5], которого не существует. В JavaScript это возвращает undefined, а при сложении undefined с числом получается NaN (Not-a-Number).
Исправление: используйте i < numbers.length (строго меньше). Вот рабочий вариант:
let numbers = [10, 20, 30, 40, 50];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
console.log(sum); // 150
Лучший способ: метод reduce()
В современном JavaScript для суммирования массива чисел рекомендуется использовать метод reduce(). Это функциональный подход, который делает код короче и понятнее.
reduce() проходит по каждому элементу массива и накапливает результат. Он принимает два аргумента:
- Функция-колбэк с двумя параметрами:
accumulator(аккумулятор — текущая сумма) иcurrentValue(текущий элемент). - Начальное значение аккумулятора (в нашем случае 0).
Пример:
let numbers = [10, 20, 30, 40, 50];
let sum = numbers.reduce((accumulator, currentValue) => {
return accumulator + currentValue;
}, 0);
console.log(sum); // 150
Можно записать ещё короче, опуская фигурные скобки и return:
let sum = numbers.reduce((acc, curr) => acc + curr, 0);
Как это работает пошагово:
- Начальное значение
acc = 0 - Первый элемент
curr = 10→acc = 0 + 10 = 10 - Второй элемент
curr = 20→acc = 10 + 20 = 30 - И так далее до последнего элемента
- Результат: 150
Другие способы (для справки)
- Цикл for...of — современная альтернатива классическому for:
let sum = 0; for (let num of numbers) { sum += num; } - Метод forEach():
let sum = 0; numbers.forEach(num => sum += num);
Важные замечания
- Метод
reduce()не изменяет исходный массив, а возвращает новое значение. - Если массив пустой,
reduce()вернёт начальное значение (в нашем случае 0). - Для массивов с очень большим количеством элементов (более 100 000) разница в производительности между циклами и
reduce()минимальна, но циклforможет быть чуть быстрее.
Рекомендую использовать reduce() — это идиоматичный способ для JavaScript, который часто встречается в реальных проектах.
Альтернативный подход: использование цикла while
Если вы предпочитаете более гибкие конструкции, можно использовать цикл while. Это особенно полезно, когда нужно выполнять дополнительные проверки во время суммирования.
let numbers = [10, 20, 30, 40, 50];
let sum = 0;
let i = 0;
while (i < numbers.length) {
sum += numbers[i];
i++;
}
console.log(sum); // 150
Дополнительно: обработка нечисловых элементов
Если в массиве могут быть нечисловые значения (например, строки), лучше добавить проверку:
let mixed = [10, '20', 30, null, 40];
let sum = 0;
for (let num of mixed) {
if (typeof num === 'number' && !isNaN(num)) {
sum += num;
} else {
console.warn('Пропущен нечисловой элемент:', num);
}
}
console.log(sum); // 80 (10 + 30 + 40)
Краткий совет
Для простых случаев используйте reduce(). Если массив может содержать "мусор" — лучше применить цикл с проверкой. Всегда помните про границы массива и типы данных!