14 Мая в 12:19
12 +1
0
Ответы
1
Ошибки и небезопасные предположения (с объяснениями, как проявятся в рантайме):
- Необъявленная переменная `total`. Выражение `total += arr[i]` пытается прочитать и обновить `total`. Чтение необъявленной переменной вызывает в рантайме `ReferenceError` (или, при наличии глобальной переменной `total`, будет использовано чужое значение, что приведёт к ошибочным результатам).
Проблема: отсутствие объявления и инициализации.
- Неинициализированный аккумулятор. Даже если `total` объявлен где‑то вне функции, он может иметь нечисловое значение или старое значение из другого вызова; нужно явно инициализировать аккумулятор, например в ...0......0......0....
- Нет проверки аргумента `arr`. Если `arr` равен `null` или `undefined`, то чтение `arr.length` даст `TypeError: Cannot read property 'length' of ...`. Если `arr` — не массив (например строка), цикл пройдёт по символам/вложенным структурам — неожиданное поведение.
- Нет проверки типов элементов. Операция `+` с нечисловыми значениями может приводить к конкатенации строк или к `NaN`. Пример: если аккумулятор — строка, то ..."1"+2==="12"...... "1" + 2 === "12" ......"1"+2==="12"...; если встречается значение, которое при численном преобразовании даёт `NaN`, дальнейшие суммы будут `NaN`.
- Использование `var` для счётчика — устаревший стиль; лучше `let`/`const`. (Не критично, но рекомендуется.)
Исправленный идиоматичный вариант (строгая версия: требует массив чисел, пустой массив даёт ...0......0......0...):
```js
function sum(arr) {
if (!Array.isArray(arr)) {
throw new TypeError('sum: argument must be an array');
}
return arr.reduce((acc, val) => {
if (typeof val !== 'number' || !Number.isFinite(val)) {
throw new TypeError('sum: array must contain only finite numbers');
}
return acc + val;
}, 0);
}
```
Пояснения:
- Используется `Array.isArray` — защита от `null`/`undefined` и не‑массивов.
- `reduce` с начальным значением ...0......0......0... гарантирует корректный результат для пустого массива.
- Проверка `typeof val === 'number' && Number.isFinite(val)` предотвращает конкатенацию и `NaN`.
Более гибкая (коэрцирующая) версия: приводит значения к числу и пропускает нечисла:
```js
function sumCoerce(arr) {
if (!Array.isArray(arr)) {
throw new TypeError('sumCoerce: argument must be an array');
}
return arr.reduce((acc, val) => {
const n = Number(val);
return Number.isFinite(n) ? acc + n : acc; // пропускаем нечисловые элементы
}, 0);
}
```
Примеры поведения:
- Пустой массив: `sum([])` вернёт ...0......0......0....
- `sum([1, 2, 3])` → ...6......6......6....
- `sum(['1', 2])` в строгой версии бросит ошибку; в `sumCoerce` даст ...3......3......3....
- Исходный фрагмент обычно выдаст `ReferenceError` при первом выполнении `total += ...` (из‑за необъявленного `total`) или будет накапливать в глобальной переменной и давать неверный результат.
Рекомендация: выбирайте строгую или коэрцирующую семантику в зависимости от требований; предпочитайте `reduce` с начальным значением ...0......0......0..., явные проверки типов и локальные переменные (не глобальные).
14 Мая в 12:53
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир