Perché typeof x mai ‘numero’ quando x proviene dalla funzione prompt?

Ho problemi a far funzionare correttamente la prima funzione (sotto). Voglio che chieda l’età dell’utente con due possibili risultati. Se l’utente inserisce il valore corretto (cioè un numero positivo) dovrebbe restituire l’età. D’altra parte, se l’utente immette un valore errato (stringa, nullo, non definito, numero negativo), dovrebbe visualizzare un messaggio di avviso e richiedere all’utente di ripetere il processo fino a quando non viene immesso e restituito un valore corretto.

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(); 

Come menzionato nei commenti, la funzione prompt() acquisisce sempre l’input come una stringa, anche quando l’input è un numero valido. Per verificare se si tratta di un numero, puoi provare ad analizzare la stringa restituita con parseInt(age_entered) (o parseFloat se vuoi consentire l’età non intera, anche se a me sembra strano), e se torni indietro un numero , l’input è buono – se torni a NaN , non era valido.

Ecco il tuo script aggiornato sulla base di questa comprensione:

 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(); 

Le altre risposte mostrano che prompt () (quasi) restituisce sempre una stringa. Avrai bisogno di analizzare la risposta prima di poterla controllare per la tua fascia di età. Ma penso che il tuo condizionale del ciclo temporale ti stia buttando fuori. Inoltre, devi analizzare parseInt () sul prompt una seconda volta, all’interno del tuo ciclo while. Provalo in questo modo:

 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); } 

Notiamo che usiamo Number.isNaN (age_entered). Questo è un modo più efficace per determinare se un valore è un numero rispetto al confronto con typeof. Vedere questo documento qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN

prompt() restituisce sempre una stringa,

Prova parseInt(prompt("Enter Your Age:")) .

Restituisce una stringa e parseInt ti salverà:

 ... let age = parseInt(age_of_user()); ...