我在 if/else 语句中嵌入了两个循环(一个 while 和一个 if)。
我想检查用户输入是否是数字,如果不是,则设置用户可以重试的次数限制(3 次),并在用户重复次数耗尽时提醒用户。如果用户从未输入数字,则返回未定义。
或者,如果用户输入数字,则跳过检查并将数字作为整数数据类型返回。
function monthlyBudget(count = 3) {
const SPEND = prompt("How much is your typical spend (in GBP) on books in a month? ");
// check if the input is not a number.
if (isNaN(SPEND)) {
while (count > 0) {
alert("Hmmm... I'm not sure I understood. Please try again.");
console.log("Spend input is not a number.");
count--
console.log(count)
monthlyBudget(count);
}
// if SPEND is not a number and count = 0.
if (count == 0) {
alert("Oh no! We are unable to process your request, please try again later.");
return undefined
}
} else {
return Number(SPEND)
}
}
但似乎它一直持续到 count = 0 并输出 count = 0 警报,但随后它返回并立即输出“嗯......我不确定我是否理解。请再试一次。”然后返回“哦不!我们无法处理您的请求,请稍后重试。”
console.log 显示一旦计数达到 0,它会再次回到 1,然后再下降到 0,因此警报与计数相匹配,但我不确定为什么这段代码会这样做?
谁能指出我哪里错了?
我第一次尝试时,if/else 语句看起来略有不同:
if (isNaN(SPEND)) {
alert("Hmmm... I'm not sure I understood. Please try again.");
console.log("Spend input is not a number.");
monthlyBudget();
} else {
return Number(SPEND);
}
但是如果第一个输入(或后续输入)是字符串,则无论下一个输入是什么,该函数都只会返回第一个字符串输入。
我不确定为什么,因为
if (isNaN(SPEND))
没有返回,而且我不确定这是否仍然是第一个块中代码的问题,因为我认为我陷入了无限循环。
您尝试通过
while
循环和递归来实现循环。这是有问题的。此外,当您进行递归调用时,您将忽略此递归调用可能返回的答案。您应该return
它并且不要再次循环。
所以改变这个:
monthlyBudget(count);
至:
return monthlyBudget(count);
现在您还可以将
while
替换为 if
,因为您肯定会执行该 return
。那里没有第二次迭代。重复是通过递归调用实现的,而不是while
循环。
注意:通过
prompt
和 alert
询问用户输入不是一个好习惯。为此,请使用 HTML 输入控件。
将
prompt
调用 inside 放入循环中,并在接受号码时退出循环(因此是相反的 if
测试)。如果循环退出,则意味着所有重试均已消耗但未成功,是时候显示最终警报了。
一些备注:
不要对接受用户输入的变量使用全部大写。通常的做法是为代码中定义的常量保留全部大写的使用。
用分号分隔所有语句。
我留在了
prompt
和 alert
中,显然您被要求用于此练习:
function monthlyBudget(count = 3) {
while (count > 0) {
let spend = prompt("How much is your typical spend (in GBP) on books in a month? ");
// check if the input is a number: if so return it (exiting)
if (!isNaN(spend)) {
return Number(spend);
}
alert("Hmmm... I'm not sure I understood. Please try again.");
console.log("Spend input is not a number.");
count--;
console.log(count);
}
// We get here when input is not a number and count = 0.
alert("Oh no! We are unable to process your request, please try again later.");
// return undefined is the default, so we can leave it out.
}
const budget = monthlyBudget();
console.log("the user provided this input:", budget);