繁体   English   中英

Javascript,关于无限循环提示并停止该循环

[英]Javascript, about infinite looping prompt and stopping that loop

我是Java的新手,所以这是我的老故事:)此代码不断使我的浏览器崩溃,并且无论我是否输入数字,如果我第一次尝试都没有取消,它都不会取消提示。 ..无论如何,即使是游戏也无法正常工作,就是要使秘密号码成为该人的猜测号码。 为了取消提示,我什至尝试了如果(answer === null || answer === false || answer ===“ null”)中断; 但它行不通。 有人可以帮忙吗? 谢谢。

这是我的代码:

<script>
var secret_number=Math.floor((Math.random() * 10) + 1); 
var answer=prompt("Enter a number you want to try");

while(secret_number!==Number(answer))
{
if(name===null||name===false||name==="null")
break;

if(Number(answer)>secret_number)
prompt("This number is too high!");

else if(Number(answer)<secret_number)
prompt("This number is too low!");

else
prompt("You got it!");
}

</script>

我有一个后续问题。 我考虑了人们告诉我的内容并提出了以下建议:

var secret_number=Math.floor((Math.random() * 10) + 1); 
var answer=parseInt(prompt("Enter a number you want to try"));

while(secret_number!==answer)
{
if(answer == null || answer == "" ||isNaN(answer))
break;

if(answer>secret_number)
answer=prompt("This number is too high!");

else if(answer<secret_number)
answer=prompt("This number is too low!");

else
alert("You got it!");
}

我的问题是,为什么我的“你明白了”! 警报持续不断吗? 我知道我可以打破它,但是我想知道为什么它会继续这样做。 它应该具有secret_number === answer并退出while循环,所以显然它没有这样做,我也不知道为什么。 再次感谢你。

您已经发现了while循环为什么很危险的原因。 最好的解决方案是限制用户的猜测数量,并且需要在循环内递增一个计数器,并且可以简单地使用for循环来完成。

另外,使用花括号将if分支包围。

最后,将字符串转换为数字的最佳方法是使用parseInt()parseFloat() 在获取字符串时立即进行转换,然后不必每次使用时都继续转换它。

 var secret_number = Math.floor((Math.random() * 10) + 1); alert("For testing only: The secret number is: " + secret_number); var answer = parseInt(prompt("Enter a number you want to try"), 10); const GUESSES = 3; for(var i = 0; i < GUESSES; ++i){ if(!isNaN(answer)){ if(answer > secret_number) { answer = prompt("Try again...This number is too high! (" + (GUESSES - i - 1) + " guesses left.)"); } else if(answer < secret_number) { answer = prompt("Try again...This number is too low! (" + (GUESSES - i - 1) + " guesses left.)"); } else { alert("You got it!"); break; } } else { alert("You didn't enter a number!"); break; } } 

问题是prompt在循环之前。 改变whiledo while可以解决这个问题:

 var secret_number=Math.floor((Math.random() * 10) + 1); do { var str = prompt("Enter a number you want to try"), answer = Number(str); if (!str || isNaN(answer)) { alert('Bye'); break; } if (answer > secret_number) { alert("This number is too high!"); } else if (answer < secret_number) { alert("This number is too low!"); } else { alert("You got it!"); } } while (secret_number !== answer); 

尝试这个。 希望能帮助到你。

 <script> var secret_number=Math.floor((Math.random() * 10) + 1); var answer=prompt("Enter a number you want to try"); while(secret_number!=Number(answer)){ if(Number(answer)>secret_number){ answer = prompt("This number is too high!"); } else if(Number(answer)<secret_number){ answer = prompt("This number is too low!"); } } prompt('correct!'); </script> 

这与其他一些答案的不同之处仅在于,在没有提供答案的情况下试图保持放弃的意图:

var secret_number=Math.floor((Math.random() * 10) + 1); 
var answer=prompt("Enter a number you want to try");

while(secret_number!==Number(answer)) {
    // "" covers case of clicking OK with nothing entered
  // null covers case of clicking Cancel
    if(answer == null || answer == "") {
        break;
  }

    if(Number(answer)>secret_number) {
        answer = prompt("This number is too high!");
    } else if(Number(answer)<secret_number) {
        answer = prompt("This number is too low!");
    }
}
if (secret_number!==Number(answer)) {
    alert("You gave up :(");
} else {
    alert("You got it!");
}

小提琴: https : //jsfiddle.net/h10qt0nn/1/

循环无休止的原因是您不会在循环内更改answer的值。 结果,每次评估while条件时, answer仍然是输入到提示中的第一个数字,并且循环再次运行。 另外值得注意的是,如果用户不输入任何内容, answer将设置为空字符串( ""

工作版本:

var secret_number=Math.floor((Math.random() * 10) + 1); 
var answer=prompt("Enter a number you want to try");

while(secret_number!==Number(answer))
{
  if(answer===null || answer = ""){
    break;
  }

  if(Number(answer)>secret_number){
    answer = prompt("This number is too high!");
  }
  else if(Number(answer)<secret_number){
    answer = prompt("This number is too low!");
  }

  else{
    alert("You got it!");
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM