Почему не работает функция 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() } |
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, вместо суммы элементов в массиве
Дополнительно:
В ответ выводит undefined
В каком месте? У тебя в обоих логах андефайт в принципе быть не может.
Можно сделать так (оставил весь ваш код, только заменил порядок одной строчки, чтобы заработало):
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() } |
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)) { |
let val = prompt('Введите значение', ''); // сохраняем оригинальное значение let numVal = Number(val); // приводим тип к числу, можно и через +val, как у вас /* расширяем условие проверки полученного значения 1. Если приведённая к типу число переменная не является числом 2. И если переменная не null (так будет в случае нажатия Отмена) 3. И если тип оригинального значения - строка и после удаления пробелов сохраняет длину (не пустая строка) */ if (!isNaN(numVal) && (val !== null) && (typeof val == 'string' && val.trim().length)) {
Всё это можно красивее написать, но потребуется сильнее изменить структуру кода.
Ответы:
1. Зачем нужен рекурсивный вызов checkNum?
2. При нажатии кнопки "Отмена" возвращается null, а +null === 0.
3. Массив тут не нужен. Совсем не нужен.
- это задача из книги learnJS на тему массивы
-
1. Зачем нужен рекурсивный вызов checkNum?
Чтобы повторно вызывать prompt и всю остальную логику для условия задачи.
Есть идеи как это сделать без рекурсии?
Можно while(true) с break по условию или что то ещё.
Но чем это лучше рекурсии? Стек не переполнится? Нет лишних вызовов функции? - Всё так, но для этой задачи не принципиально.По номеру 2 вы правы.
А вот массив нужен по условию задачи. - justaoneuser, цикл гораздо проще и нагляднее рекурсии. В данном случае вы уходите в рекурсию не изменив массива и, когда получаете завершающий элемент, массив у вас пустой. В результате получаем:
0 // вывод суммы пустого массива Array [ 3 ] // вывод массива в обратном порядке Array [ 3, 2 ] // при развёртывании рекурсии Array(3) [ 3, 2, 1 ] undefined // результат работы функции sumInput(), //поскольку она ничего не возвращает
0 // вывод суммы пустого массива Array [ 3 ] // вывод массива в обратном порядке Array [ 3, 2 ] // при развёртывании рекурсии Array(3) [ 3, 2, 1 ] undefined // результат работы функции sumInput(), //поскольку она ничего не возвращает
- Rsa97, да всё так. Просто хотел уточнить что с рекурсией тоже можно.
Почему то многие избегают рекурсии в принципе, даже в задачах где код с ней получается проще и короче.
Это, конечно, не тот случай. Но если хочется поиграться с рекурсивными функциями - ничего страшного, наоборот может пригодиться позже. - Rsa97,
цикл гораздо проще и нагляднее рекурсии.
Я бы поспорил с этим утверждением.) Вот вообще не всегда именно проще и лучше. Но в данном случае да, поддерживаю.
const sumInput = (input = +prompt('Введите значение', ''), sum = 0) => (!!input && typeof(input) !== 'string') ? (sum += input, sumInput(+prompt('Введите значение', ''), sum)) : sum; console.log(sumInput()); |
const sumInput = (input = +prompt('Введите значение', ''), sum = 0) => (!!input && typeof(input) !== 'string') ? (sum += input, sumInput(+prompt('Введите значение', ''), sum)) : sum; console.log(sumInput());
- Прикольно, но без массива.
Вот так ещё можно:const sumInput = (arr = []) => ((val, numVal) => val !== null && !isNaN(numVal) && val.trim().length ? sumInput([...arr, numVal]) : arr.reduce((a, b) => a + b))(val = prompt('', ''), Number(val))
const sumInput = (arr = []) => ((val, numVal) => val !== null && !isNaN(numVal) && val.trim().length ? sumInput([...arr, numVal]) : arr.reduce((a, b) => a + b))(val = prompt('', ''), Number(val))
Можно убрать вложенную анонимную функцию, но вообще смысл этих заданий чтобы разобраться с конкретной темой, на сколько понимаю, в данном случае с массивами. А вот такой однострочник со стрелочными функциями как у вас (или у меня) не способствует этой цели. А только запутывает в JS-синтаксисе, который не сказать что простой слишком.
- justaoneuser,
Моё решение логически верное, нет смысла заполнять массив и считать сумму элементов, достаточно посчитать сумму и вернуть её.
Додумывать что-то за непонятно кем, что он там подразумевал, чему хотел научить - да мне плевать, честно.
Есть задача - есть решение, если задача некорректная, корректируется задача, а не адаптируется решение к ней.Мне несколько лет назад отвечали на мой вопрос так, чтобы я увидел (или разобрался) как нужно, а не как я хочу. - благодаря этому и не только я знаю столько, сколько я знаю сейчас.
const sumInput = (input = +prompt('', ''), sum = 0, arr = []) => (!!input && typeof(input) !== 'string') ? (arr.push(input), sumInput(+prompt('', ''), 0, arr)) : arr.reduce((a, c) => a + c);
const sumInput = (input = +prompt('', ''), sum = 0, arr = []) => (!!input && typeof(input) !== 'string') ? (arr.push(input), sumInput(+prompt('', ''), 0, arr)) : arr.reduce((a, c) => a + c);
- historydev, логически верно и на SQL посчитать, например. Но это не соответствует условиям задачи.
В том то и дело, что "как нужно" - это хранить числа в массиве. Остальное - уже фантазии на тему.Понимаете, решить экзотическим способом можно, но вопрос у автора был не про code golf, а ну немного другой был вопрос.
А так, вот:
const sumInput = (arr = [], fn = () => prompt('', ''), val = fn()) => val && !val.match(/[^d]/g) ? sumInput([...arr, +val], fn, fn()) : arr.reduce((a, b) => a + b);
const sumInput = (arr = [], fn = () => prompt('', ''), val = fn()) => val && !val.match(/[^d]/g) ? sumInput([...arr, +val], fn, fn()) : arr.reduce((a, b) => a + b);
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для того чтобы понять, почему функция JavaScript не работает, необходимо провести некоторые проверки и анализировать код.
1. Проверьте синтаксис: убедитесь, что все скобки, точки с запятой, кавычки и другие символы используются правильно. Ошибки в синтаксисе могут привести к неработающему коду.
2. Проверьте консоль: откройте консоль браузера (обычно нажатием F12) и посмотрите наличие ошибок. Ошибки в консоли могут помочь вам понять, что именно идет не так.
3. Проверьте пути к файлам: если ваш скрипт подключается из внешнего файла, убедитесь, что путь к нему указан правильно. Неправильный путь может привести к тому, что скрипт не будет загружен.
4. Проверьте порядок выполнения: убедитесь, что функция вызывается после загрузки всех необходимых элементов страницы. Иногда JavaScript функции не срабатывают из-за того, что элементы, с которыми они работают, еще не загружены.
5. Проверьте блокировщики рекламы: некоторые расширения для браузера или программы блокировки рекламы могут блокировать выполнение JavaScript кода. Попробуйте отключить их и проверить работу функции.
Вот пример кода на JavaScript, который может помочь вам отловить ошибки:
function myFunction() { console.log("Функция сработала успешно!"); } window.onload = function() { myFunction(); };
Проверьте вышеперечисленные пункты и исправьте любые ошибки, которые найдете. Надеюсь, эти советы помогут вам разобраться с проблемой и заставить вашу функцию JavaScript работать.