【问题标题】:While loop exits instead of returning to the loop -JavascriptWhile循环退出而不是返回循环-Javascript
【发布时间】:2016-01-25 23:23:40
【问题描述】:

试图只得到一个数字答案。内部 while 循环退出而不是返回到循环中。我不确定为什么。

var numPlays = prompt("How many games do you want to play?");
if (isNaN(numPlays) == true) {
    while (isNaN(numPlays) == true) {
        numPlays = prompt("That's not a number. Please pick a number.");
    }
} else if (numPlays == 0) {
    while (numPlays == 0) {
        numPlays = prompt("You have to at least play one game. Please pick a number.");
    }
} else if (numPlays == 1) {
    alert("OK! Let's play " + numPlays + " game!");
} else {
    alert("OK! Let's play best of " + numPlays + "!");
}

【问题讨论】:

  • 你有 两个 while 循环。每个只检查一种特定类型的错误。如果有人键入0,则跳过第一个。第二个将报告该错误并要求另一个号码。如果您随后键入“XYZ”,则第二个 while 循环将退出,因为“XYZ”不等于 0。
  • 如果 while 循环为假,我如何返回外部 if/else 语句?例如,如果我先输入 0,然后输入 2,我如何让计算机提示“OK!让我们玩最好的”+ numPlays + “!”
  • isNaN 检查值是否为NaN(这是一个特殊的 IEEE754 值)。它不是用来检查它是否是一个数字。

标签: javascript loops while-loop


【解决方案1】:

无需进入循环。

一个简单的例子

// Wrap in a function so we can start over
function start() {
  var numPlays = prompt("How many games do you want to play?");
  // edited this to check for 0
  if (isNaN(numPlays) || numPlays == 0) {
    alert('Nope, bad answer, try again!');
    return start();
  } else if (numPlays == 1) {
    alert('Ok, lets play 1 game!');
  } else {
    alert('Ok, lets play the best of ' + numPlays + 'games!');
    // A little aside
    // var neededToWin = (Math.floor((numPlays / 2)) + 1);
    // alert('Ok, you need to win ' + neededToWin + ' out of ' + numPlays + ' games to beat me!');
  }
}

从技术上讲,您会希望从“一半的游戏 + 1”中获得最好的结果。 所以要赢,你需要赢下 7/12 场比赛。你可以通过划分来找到这个

【讨论】:

  • 你的函数应该在它满意时返回该值。
  • 由 OP 选择下一步做什么。
【解决方案2】:

由于 if/elseif 结构;只有其中一个可以匹配。第一次运行时,它会询问第 1 行的数字,然后决定要通过 if/elseif/else 结构的哪个分支。以后改numPlays的值也没关系,决定已经做出了!

您可能希望在这里进行递归调用。

function getNumPlays(message) {
    if (!message) { message = "How many games do you want to play?"; }
    var numPlays = parseInt(prompt(message), 10);
    if (isNaN(numPlays)) {
        return getNumPlays("That's not a number.");
    } else if (numPlays < 1) {
        return getNumPlays("You have to at least play one game.");
    }
    return numPlays;
}
var numChosen = getNumPlays();
if (numPlays === 1) {
    alert("OK! Lets play " + numChosen + " game!");
} else {
    alert("OK! Let's play best of " + numChosen + "!");
}

PS:注意里面的parseInt(..., 10)。这将转换为数字或NaN。 “10”部分很重要;它指定数字的基数。八进制数写为“011”,有时javascript引擎不知道您想要八进制还是十进制。

【讨论】:

    【解决方案3】:

    空输入将评估为 false(在您的 while 循环中为“ok”)。

    尝试使用 parseInt(),它会为空字符串和非数字返回 NaN,使用以下方法测试一些您自己的示例:

    isNaN(parseInt(prompt("enter number")))
    

    【讨论】:

      【解决方案4】:
      var numPlays = prompt("How many games do you want to play?");
      
      
      while (isNaN(numPlays) == true || numPlays == 0) {
      
              if(isNaN(numPlays) == true)
                  numPlays = prompt("That's not a number. Please pick a number.");
              else    
                  numPlays = prompt("You have to at least play one game. Please pick a number.");
         }
      
      if (numPlays == 1) 
          alert("OK! Let's play " + numPlays + " game!");
      else 
          alert("OK! Let's play best of " + numPlays + "!");
      

      我们是否必须拥有所有这些嵌套循环...这是必需的吗?我们可以让它更简单吗?

      【讨论】:

        猜你喜欢
        • 2012-05-15
        • 2019-11-06
        • 2015-11-17
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多