@ramil456

Почему не работает функция js?

У меня есть такая задача:

Напишите функцию sumInput(), которая:

Просит пользователя ввести значения, используя prompt и сохраняет их в массив.
Заканчивает запрашивать значения, когда пользователь введёт не числовое значение, пустую строку или нажмёт «Отмена».
Подсчитывает и возвращает сумму элементов массива.
P.S. Ноль 0 – считается числом, не останавливайте ввод значений при вводе «0».

Вот код который я написал:
function sumInput() {
	let arr = []
	let sum = 0
	function checkNum() {
		let numVal = +prompt('Введите значение', '')
		if (!isNaN(numVal)) {
			checkNum()
			arr.push(numVal)
			console.log(arr)
		} else {
			for (let i = 0; i < arr.length; i++) {
				sum += arr[i]
			}
			console.log(sum)
		}
	}
	checkNum()
}


В ответ выводит undefined, вместо суммы элементов в массиве
  • Вопрос задан
  • 885 просмотров
Решения вопроса 1
@justaoneuser
Можно сделать так (оставил весь ваш код, только заменил порядок одной строчки, чтобы заработало):
function sumInput() {
	let arr = []
	let sum = 0
	function checkNum() {
		let numVal = +prompt('Введите значение', '')
		if (!isNaN(numVal)) {
//			checkNum()           // было так
			arr.push(numVal)  // добавляем элемент в массив
			console.log(arr)
			checkNum()         // только после этого вызываем функцию checkNum
		} else {
			for (let i = 0; i < arr.length; i++) {
				sum += arr[i]
			}
			console.log(sum)
		}
	}
	checkNum()
}

Код не работал потому что "вся полезная работа" откладывалась из за преждевременного вызова checkNum. А поскольку вызов рекурсивный, то сложно заметить такую ошибку и вообще понять что происходит в коде. Но в принципе ваш подход рабочий.

То что в консоли бывает undefined - это потому что основная функция sumInput ничего не возвращает явно (нет return). Но такие функции в JS всё же возвращают значение, просто оно не определено - undefined.

P.S.: Чтобы выполнить остальные условия из задания (пуcтая строка, кнопка Отмена), можно сделать так:
let val = prompt('Введите значение', '');  // сохраняем оригинальное значение
let numVal = Number(val);   // приводим тип к числу, можно и через +val, как у вас
/*
расширяем условие проверки полученного значения
1. Если приведённая к типу число переменная не является числом
2. И если переменная не null (так будет в случае нажатия Отмена)
3. И если тип оригинального значения - строка и после удаления пробелов сохраняет длину (не пустая строка)
*/
if (!isNaN(numVal) && (val !== null) && (typeof val == 'string' && val.trim().length)) {

Всё это можно красивее написать, но потребуется сильнее изменить структуру кода.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
1. Зачем нужен рекурсивный вызов checkNum?
2. При нажатии кнопки "Отмена" возвращается null, а +null === 0.
3. Массив тут не нужен. Совсем не нужен.
Ответ написан
@historydev Куратор тега JavaScript
Острая аллергия на анимешников
const sumInput = (input = +prompt('Введите значение', ''), sum = 0) => (!!input && typeof(input) !== 'string') ? (sum += input, sumInput(+prompt('Введите значение', ''), sum)) : sum; 

console.log(sumInput());
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы