while循环使用嵌套的if语句提前终止

时间:2017-11-01 01:31:02

标签: javascript loops if-statement while-loop

我正在通过JavaScript中的prompt()编写一个简单输入的条件检查。我们的想法是重复提示,直到用户提供正整数。

特别是,如果我提交一个负整数,它会通过情况3再次正确地提示我。但是,如果我再次使用负整数回答第二个提示,则代码意外地离开了while循环。

在if语句中:

案例1:检查用户是否“取消”提示框(或返回空字符串),在这种情况下,我将变量'cancelGridCreation'设置为'true'以稍后取消封装过程(在包含的代码之外) ),然后通过将变量'waitingForQualifyingAnswer'设置为'false'来终止while循环。

案例2:检查响应是否是可接受的整数(数字,整数,正数),并设置条件变量'false'以终止while循环。

案例3:再次提示用户,并认为新输入的数据将被相同的3'如果'案例再次检查。

匹配案例1和2的用户输入似乎工作正常。但是,如上所述,输入负整数2次会终止while循环。查看我收到的控制台输出,输入-10然后输入-20。同样,console.log()输出似乎不会出现在与代码中的位置匹配的顺序中(可能是处理时滞问题?)。您将看到来自案例3的console.log()在“初始大小输入”console.log()之前输出,它在while循环开始之前编码。

类似的结果似乎发生在案例3后面跟着另一个案例3(无论输入是否为负整数,小数或字符串),以及案例3后跟案例1(当然,此处案例1将终止循环,但控制台日志语句似乎仍然无序发生)。

链接到JSBin的交互式代码:https://jsbin.com/koheku/1/edit?js,console

JavaScript代码:

let cancelGridCreation = false;
let waitingForQualifyingAnswer = true;
let answer = prompt('Please enter the number of rows/columns, as a positive integer:', '16');
let gridSize = parseFloat(answer, 10);
console.log('initial size entered: ' + gridSize);
while (waitingForQualifyingAnswer === true) {
  console.log('top of while loop');
  if (answer == null || answer == "") {
    console.log('prompt - canceled');     
    cancelGridCreation = true;
    waitingForQualifyingAnswer = false;
  } else if (typeof gridSize === 'number' && gridSize % 1 === 0 && gridSize > 0) {
    console.log('prompt - good answer: ' + gridSize);
    waitingForQualifyingAnswer = false;
  } else {
    console.log('prompt - BAD answer: ' + gridSize);
    answer = prompt('Incorrect format entered.  Please enter the number of rows/columns, as a positive integer:', '16');
    gridSize = parseFloat(answer, 10);
    console.log('new size entered: ' + gridSize);
  }
  console.log('end of while loop');
}
console.log('done:');
console.log(gridSize);

控制台输出如下(在第一个提示输入-10,在第二个提示输入-20):

    "prompt - BAD answer: -10"
    "top of while loop"
    "initial size entered: -10"
    "new size entered: -20"
    "end of while loop"
    "done:"
    -20

我很新,并意识到可能有更简洁的方法来实现这一目标。我对建议很感兴趣,但是,当我只提交案例3输入时,我也很想知道为什么while循环结束。

请注意:console.log()语句只是一种简单的调试方法。我意识到parseInt()会截断任何小数,但我选择允许整数作为可接受的大小。

感谢您提供任何建议:)

0 个答案:

没有答案