与简单的循环混淆 - JavaScript

时间:2013-10-25 03:57:41

标签: javascript for-loop

我已经多次完成了FizzBu​​zz但从未遇到过这个问题。也许,这是我不理解的for循环的基础。出于某种原因,下面的代码比它应该运行的时间长10倍(好吧,比我想的那样)。如果用户输入20,则运行到200.我通过设置i = 0修复了问题。我< num然后将i + 1打印到我的div,但我仍然不明白为什么原始代码不能按预期工作。虽然我很喜欢,但我还是承认我仍然无法正确设置JSFiddle。 http://jsfiddle.net/nngrey/hA4pg/(这根本不会运行。)所以对此的任何想法也将受到赞赏。谢谢!

<head>
  <title>Fizz Buzz</title>
  <script>
    function fizzbuzz(){
      var num = prompt("Please enter a number between 1 and 100: ");
      for(var i=1; i<num+1; i++){
        if (i%3===0 && i%5===0){
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>Fizz Buzz</p>";
        }else if (i%3===0){
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>Fizz</p>";
        }else if (i%5===0){
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>Buzz</p>";
        }else{
          document.getElementById("div1").innerHTML = div1.innerHTML+"<p>"+i+"</p>";
        }
      }
    }
  </script>
</head>

<body onLoad = "fizzbuzz()">
  <div id = "div1">
    <h1>Fizz Buzz</h1>
  </div> 
</body>

4 个答案:

答案 0 :(得分:4)

在您的代码中,prompt()返回一个字符串。 Javascript将评估此行:

      for(var i=1; i<num+1; i++){

num作为字符串。即num + 1变为“20”+“1”(注意引号),即“201”。然后以数字方式对比较进行评估,因此你的循环运行的时间比它应该延长十倍。

在修订后的版本中i < num会以数字方式进行评估,因此循环运行的时间正确。

您可以强制num成为这样的数字:

      var num = Number(prompt("Please enter a number between 1 and 100: "));

num现在是一个数字,所以20 + 1 = 21(注意 - 没有引号),你的循环的两个版本都应该正常运行

答案 1 :(得分:0)

你需要这样做:

var num = parseInt(prompt("Please enter a number between 1 and 100: "), 0);

prompt会返回一个字符串,因此,如果您输入20num+1就是字符串"201",而不是数字21

答案 2 :(得分:0)

prompt()返回一个字符串。

简单地使用+prompt()代替。这应该是一个数字。更新了code demo

答案 3 :(得分:0)

此处num是一个字符串,您必须使用parseInt将其转换为int

for(var i=1; i<parseInt(num)+1; i++){
}