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!");
}
}
我是 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!");
}
}