为什么 if/else 语句中的嵌套 while 循环不能正确输出(无限循环)?

问题描述 投票:0回答:1

我在 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))
没有返回,而且我不确定这是否仍然是第一个块中代码的问题,因为我认为我陷入了无限循环。

javascript loops if-statement while-loop infinite-loop
1个回答
1
投票

您尝试通过

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

© www.soinside.com 2019 - 2024. All rights reserved.