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

Javascript, about infinite looping prompt and stopping that loop

我是 javascript 的新手,所以这就是我的背景故事 :) 这段代码总是让我的浏览器崩溃,如果我没有在第一次尝试时取消,它就不会让我取消提示,不管我是否输入数字......反正连游戏都不行,只是为了达到秘密数字是人的猜测数字的地步。为了取消提示,我什至尝试了 if(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!");
}

我的问题是,为什么我的 "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 在循环之前。将 while 更改为 do 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!");
}

Fiddle: 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!");
  }
}