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

Why isn't my nested while loop in an if/else statement outputting correctly (infinite loop)?

提问人:chiaseed 提问时间:9/7/2023 最后编辑:isherwoodchiaseed 更新时间:9/7/2023 访问量:32

问:

我在 if/else 语句中嵌入了两个循环(a while 和一个 if)。

我想检查用户输入是否是一个数字,如果不是,请设置用户可以重试(3 次)的次数限制,并在重复次数用完时提醒用户。如果用户从不输入数字,则返回 undefined。

或者,如果用户输入数字,请跳过检查并将该数字作为整数数据类型返回。

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

但似乎它会一直到计数 = 0 并输出计数 = 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 循环 if-statement while 循环 无限循环

评论


答:

1赞 trincot 9/7/2023 #1

您尝试通过循环和递归来实现循环。这是有问题的。此外,当您进行递归调用时,您将忽略此递归调用可能返回的答案。你应该这样做,而不是再次循环。whilereturn

所以改变这个:

monthlyBudget(count);

自:

return monthlyBudget(count);

现在你也可以用 替换它,因为它确定你会执行它。那里没有第二次迭代。重复是通过递归调用实现的,而不是循环。whileifreturnwhile

注意:通过 和 询问用户输入不是好的做法。为此,请使用 HTML 输入控件。promptalert

使用迭代,无递归

将呼叫放入循环,并在接受号码时退出循环(因此是相反的测试)。如果循环退出,则表示所有重试都已使用,但未成功,是时候显示最终警报了。promptif

一些评论:

  • 不要对接受用户输入的变量使用 ALL CAPS。通常的做法是将 ALL CAPS 的使用保留给代码中定义的常量。

  • 用分号分隔所有语句。

我离开了 ,显然你被要求用于这个练习:promptalert

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

评论

0赞 chiaseed 9/7/2023
对原始的 if/else 语句进行替换工作完美并摆脱了最初的问题,非常感谢!可悲的是,两者都使用并且是该函数的分配要求。promptalert
0赞 chiaseed 9/7/2023
我还有另一个问题,如果可以的话,您能否推荐一种实现循环的方法,让用户有 N 次机会输入数字?while
0赞 trincot 9/7/2023
当然,把它添加到我的答案中。
1赞 chiaseed 9/7/2023
是的!我现在才看到你的编辑之前就想通了,它读起来差不多,但我的版本要笨拙得多,哈哈。再次感谢!:)