【问题标题】:while loop does not break outwhile 循环不会爆发
【发布时间】:2017-12-07 06:28:27
【问题描述】:

做一个练习,我不知道为什么我的 while 循环没有转义,它一直说即使只输入数字,这些值也是无效的。有什么想法吗?

// 31. Karvonen Heart Rate
var age, restingPulse, targetRate, numCheckAge, numCheckPulse, valid;
    
    valid = false;
    numCheckAge = /^\d+$/.test(age);
    numCheckPulse = /^\d+$/.test(restingPulse);
    
    while(valid === false) {
      age = parseFloat(prompt("Enter your age:"));
      restingPulse = parseFloat(prompt("Enter your resting heart rate:"));
      if(numCheckAge === true && numCheckPulse === true) {
        valid = true;
      } else {
        alert("Sorry. That's not a valid input, please enter numbers.");
      }
    }
    
    for (var i = 0.55; i < 1; i+=0.05){
      targetRate = (((220 - age) - restingPulse) * i) + restingPulse;
      document.write("Intensity: " + Math.round((i * 100)) + "% | Rate: " + Math.round(targetRate) + "<br>");
    }

【问题讨论】:

  • 您需要在循环内的正则表达式上执行tests(在输入agerestingPulse之后)。
  • 使用调试器会立即显示numCheckAgenumCheckPulse 只设置一次,以后不会更新...
  • 另外,您可以使用isNaN(age) 而不是正则表达式来检查输入是否为数字

标签: javascript for-loop while-loop


【解决方案1】:

我已经简化和灵活了你的代码;)

看看这个:

    
function requireNumericPrompt(text) {
  var value;
  while(true) {
    if(/^\d+$/.test(value = prompt(text))) {
      return value;
    }
    alert("Sorry. Please enter valid (numeric) value.");
  }
}

var age = parseInt(requireNumericPrompt("Enter your age:"));
var restingPulse = parseInt(requireNumericPrompt("Enter your resting heart rate:"));

document.write('Age: ' + age + '<br/>');
document.write('Resting pulse: ' + restingPulse + '<br/>');
for (var targetRate, i = 0.55; i < 1; i+=0.05){
  targetRate = (((220 - age) - restingPulse) * i) + restingPulse;
  document.write("Intensity: " + Math.round((i * 100)) + "% | Rate: " + Math.round(targetRate) + "<br>");
}

【讨论】:

  • 乐于助人 (:
  • 请注意,如果他们真的期望使用 /\d+$/ 的浮点数将不匹配,因为浮点数将被转换为字符串并且该模式将不匹配小数
【解决方案2】:

在您测试正则表达式时,这些变量agerestingPulseundefined。您必须将用于测试的代码移到循环内, 这些变量从用户输入接收到值:

while(!valid) {
  age = parseFloat(prompt("Enter your age:"));
  restingPulse = parseFloat(prompt("Enter your resting heart rate:"));

  numCheckAge = /^\d+$/.test(age);
  numCheckPulse = /^\d+$/.test(restingPulse);
  if(numCheckAge && numCheckPulse) {
    valid = true;
  } 
  else {
    alert("Sorry. That's not a valid input, please enter numbers.");
  }
} 

也可以去掉=== true位,直接用变量的真值进行测试。

【讨论】:

    【解决方案3】:

    var age, restingPulse, targetRate, numCheckAge, numCheckPulse, valid;
    
    valid = false;
    numCheckAge =function(a) { 
    	return /^\d+$/.test(a);
    }
    numCheckPulse = function(a){
     return /^\d+$/.test(restingPulse);
    } 
    
    while(valid === false) {
      age = parseFloat(prompt("Enter your age:"));
      restingPulse = parseFloat(prompt("Enter your resting heart rate:"));
      if(numCheckAge(age) && numCheckPulse(restingPulse)) {
        valid = true;
      } else {
        alert("Sorry. That's not a valid input, please enter numbers.");
      }
    }
    
    for (var i = 0.55; i < 1; i+=0.05){
      targetRate = (((220 - age) - restingPulse) * i) + restingPulse;
      document.write("Intensity: " + Math.round((i * 100)) + "% | Rate: " + Math.round(targetRate) + "<br>");
    }

    您需要将检查代码转换为函数而不是变量。

    【讨论】:

      【解决方案4】:

      您在正确的轨道上只是忘记初始化变量。

      var age, restingPulse, targetRate, numCheckAge, numCheckPulse, valid;
      
      age = 0;
      restingPulse = 0;
      
      valid = false;
      numCheckAge = /^\d+$/.test(age);
      numCheckPulse = /^\d+$/.test(restingPulse);
      
      while(valid !== true) {
          age = parseFloat(prompt("Enter your age:"));
          restingPulse = parseFloat(prompt("Enter your resting heart rate:"));
          if(numCheckAge === true && numCheckPulse === true) {
              valid = true;
          } else {
              alert("Sorry. That's not a valid input, please enter numbers.");
          }
      }
      
      for (var i = 0.55; i < 1; i+=0.05){
          targetRate = (((220 - age) - restingPulse) * i) + restingPulse;
          document.write("Intensity: " + Math.round((i * 100)) + "% | Rate: " + Math.round(targetRate) + "<br>");
      }

      【讨论】:

      • 验证 0 个值?为什么?
      • 因为你是用 JavaScript 模仿 OOP,除非变量有静态存储空间,否则它的初始值是不确定的。
      • 好的。但是它如何在 if 语句之前检查输入的数据:if(numCheckAge === true &amp;&amp; numCheckPulse === true) {
      猜你喜欢
      • 2013-09-28
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2021-01-30
      • 2013-11-01
      相关资源
      最近更新 更多