【问题标题】:multiple conditions within a while loop - Javascriptwhile循环中的多个条件 - Javascript
【发布时间】:2016-04-08 14:26:21
【问题描述】:

我想提示用户输入,如果它不是有效的选项,则重新提示,直到输入有效的输入。

现在无论输入是否正确,它总是重新提示。

代码如下:

var userChoice = prompt("Do you choose rock, paper, scissors or rope?");
while (userChoice != "rock" || "paper" || "scissors" || "rope") {
    userChoice = prompt("Sorry invalid input, please enter either: rock, paper,scissors, or rope.");
}

似乎这应该是一件简单的事情,我是否误解了如何使用 while 循环?也许运营商错了? 一直没有找到有用的东西,感谢任何帮助!

【问题讨论】:

  • @djechlin 在您对游戏感到极度厌倦后上吊自己,立即失去。 ;-)

标签: javascript while-loop


【解决方案1】:

我会尝试一个更通用的答案:

while 循环运行,而括号中的内容是 TRUE

|| 的工作方式,如果至少一个 操作数是TRUE,它将评估为TRUE

所以在你的情况下,即使你选择

userChoice = "rock";
userChoice != "rock" => FALSE

|| 之后的任何内容仍将评估为 TRUE,因为

"rock" != "paper" => TRUE 

因此括号中的整个条件将评估为TRUE

因此,为了跳出循环,您需要将括号中的条件计算为FALSE

&& 的工作方式是,如果 至少一个 操作数的计算结果为 FALSE,它将计算为 FALSE

因为

userChoice = "rock";
userChoice != "rock" => FALSE

循环甚至不检查您可能拥有的其余条件并跳出循环。

【讨论】:

    【解决方案2】:

    对于更复杂的规则(如忽略大小写),可以使用正则表达式,例如match:

    while( ! userChoice.match(/^\s*(?:rock|paper|scissors|rope)\s*$/i)) { ... }
    

    (请参阅https://regex101.com/r/sV3tJ1/1#javascript 上的正则表达式说明)

    注意:感谢 Willem Van Onsem 建议正则表达式


    也可以使用对象字面量:

    var validChoices = {rock: true,
                        paper: true,
                        scissors: true,
                        rope: true},
        userChoice = ...
    while ( ! validChoices.hasOwnProperty(userChoice)) {
      ...
    }
    

    ES6 Set 用于 2016 年最新的浏览器:new Set(["rock", "paper", ...])

    【讨论】:

    • 如果您想检查一组 huge 值,正则表达式可能会更有效。尽管如此,创造力 +1 ;)
    • @WillemVanOnsem 实际上,即使对于在此特定问题中接受杂散空格的不区分大小写的解决方案,正则表达式也会更好,感谢您的建议
    【解决方案3】:

    你也可以使用数组和 indexOf

    var userChoice = prompt("rock, paper, scissors, rope?").toLowerCase();
    while (["rock", "paper", "scissors", "rope"].indexOf(userChoice) === -1) {
        userChoice = prompt("Please choose: rock, paper, scissors, rope?").toLowerCase();
    }
    
    alert("You chose '" + userChoice + "'");
    

    【讨论】:

    • 首先感谢您的帮助,所以让我尝试解释您的代码,我真的是这个新手哈!初始提示要求选择(全部以小写字母显示),然后在 while 循环中,您使用字符串“rock”等创建了一个数组,“rock”为 0,“paper”在该数组中为 1?然后 indexof(userchoice) 搜索我想要的输入,也就是数组的参数。 -1 表示如果它不是任何正确答案,它将重新提示,如果正确,将显示警报选项?对吗?
    • 并且刚刚查找了 .indexOf 所以可以看到 -1 表示搜索不成功,.indexOf 和 str.search 之间有什么有意义的区别吗?它们似乎都提供了相似的功能
    • 对于您的第一条评论,这听起来像是对代码的正确理解。 Strings 有一个 indexOf 函数,它提供的功能与 array 的 indexOf 相当(提供找到的项目的偏移量,如果不匹配,则为 -1)。
    【解决方案4】:

    也许数组与Array.prototype.indexOf() 一起使用会更智能。

    var userChoice;
    while (!~["rock", "paper", "scissors", "rope"].indexOf(userChoice)) {
        userChoice = prompt("Sorry invalid input, please enter either: rock, paper,scissors, or rope.");
    }

    【讨论】:

      【解决方案5】:

      "rock" || "paper" 的语法是有效的,但是 OR 会比相等检查晚绑定,所以基本上你写:

      while ((userChoice != "rock") || "paper" || "scissors" || "rope") {
          //...
      }
      

      现在既然你使用了这样的或,你基本上做一个有效性检查,至少"paper"是有效的。但是,您可以通过使用显式检查并使用 && 运算符而不是 || 来获得您想要的行为:

      while (userChoice !== "rock" && userChoice !== "paper" && userChoice !== "scissors" && userChoice !== "rope") {
          //...
      }
      

      【讨论】:

        【解决方案6】:

        虽然 userChoice 不等于任何选择...所以 AND

        while (userChoice != "rock" && userChoice != "paper" && userChoice != "scissors" && userChoice != "rope") {
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-02
          • 2015-12-16
          • 2022-10-14
          • 2016-02-14
          • 1970-01-01
          • 2012-09-09
          相关资源
          最近更新 更多