Почему typeof x never ‘number’, когда x приходит из функции prompt?

У меня возникла проблема с тем, чтобы первая функция (ниже) работала правильно. Я хочу, чтобы он попросил возраст пользователя с двумя возможными результатами. Если пользователь вводит правильное значение (то есть положительное число), он должен вернуть возраст. С другой стороны, если пользователь вводит неверное значение (строка, нуль, неопределенное, отрицательное число), он должен отображать предупреждающее сообщение и повторять процесс пользователя до тех пор, пока правильное значение не будет введено и не будет возвращено.

function age_of_user() { let age_entered = prompt("Enter Your Age:"); while (typeof age_entered !== "number" || age_entered < 0) { alert("You entered an incorrect value. Please enter correct age."); age_entered = prompt("Enter Your Age:"); } return age_entered; } function confirm_age() { let age = age_of_user(); if (age < 18) { alert("Sorry! You need to be an adult to view content."); } else { alert("Welcome to our site."); } } confirm_age(); 

Как указано в комментариях, функция prompt() всегда фиксирует ввод как строку, даже если вход является допустимым числом. Чтобы проверить, является ли это числом, вы можете попытаться проанализировать возвращенную строку с помощью parseInt(age_entered) (или parseFloat если вы хотите разрешить нецелочисленный возраст, хотя это было бы странно для меня), и если вы вернете номер , вход хороший – если вы вернетесь на NaN , это недействительно.

Вот ваш сценарий, обновленный на основе этого понимания:

 function age_of_user() { let age_entered = parseInt(prompt("Enter Your Age:")); while (Number.isNaN(age_entered) || age_entered <= 0) { alert("You entered an incorrect value. Please enter correct age."); age_entered = parseInt(prompt("Enter Your Age:")); } return age_entered; } function confirm_age() { let age = age_of_user(); if (age < 18) { alert("Sorry! You need to be an adult to view content."); } else { alert("Welcome to our site."); } } confirm_age(); 

Другие ответы показывают, что prompt () (почти) всегда возвращает строку. Вам нужно проанализировать ответ, прежде чем вы сможете проверить его на свой возрастный диапазон. Но я думаю, что ваш while-loop условный отбрасывает вас. Также вам нужно parseInt () в приглашении во второй раз, внутри цикла while. Попробуйте вот так:

 let age_entered = prompt("Enter Your Age:"); age_entered = parseInt(age_entered); while (age_entered <= 0 || Number.isNaN(age_entered)) { alert("You entered an incorrect value. Please enter correct age."); age_entered = prompt("Enter Your Age:"); // do parseInt again age_entered = parseInt(age_entered); } 

Обратите внимание, что мы используем Number.isNaN (age_entered). Это более надежный способ определить, является ли значение числом, отличным от типаof. См. Этот документ здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN

prompt() всегда возвращает строку,

Попробуйте parseInt(prompt("Enter Your Age:")) .

Он возвращает строку, и parseInt сохранит вас:

 ... let age = parseInt(age_of_user()); ... 
  • Как получить параметр URL в Express?
  • Невозможно понять параметр useCapture в addEventListener
  • javascript удалить атрибут «disabled» из html-входа
  • Очистка localStorage в javascript?
  • Создайте массив с одним и тем же элементом, который повторяется несколько раз
  • Преобразование размера файла в байтах в удобочитаемую строку
  • Angular 4.3.3 HttpClient: как получить значение из заголовка ответа?
  • Как передать аргументы командной строки программе Node.js?
  • Обновить переменную родительской области в угловом
  • Разница между \ w и \ b регулярными выражениями метасимволов
  • Как вы используете WGET для зеркального отображения уровня сайта 1, восстановления JS, ресурсов CSS, включая изображения CSS?
  • Давайте будем гением компьютера.