JavaScript。循环问题

时间:2018-10-22 14:43:22

标签: javascript

尝试创建一段代码,以返回小于1000的所有数字(是三的倍数)。这是相关的代码。

  <script>
  var i = 1;
  var mplesOf3 = [0];
  var myNum = 0;
  while (myNum < 1000){
    (3 * i) = myNum;
    mplesOf3.push(myNum);
    i++;
  };
  alert(mplesOf3);
  </script>

代码在html页面中运行,因此提供了样式标签和警报。

代码基本上尝试执行3x1然后3x2然后3x3等等,直到结果超过1000。几天前我提出了这个概念,但我仍然不确定为什么它不能正常运行。

从记录来看,我已经看到了其他解决方案,但是由于我正在学习并且想改进,所以我想知道为什么该解决方案不起作用。

提前谢谢

编辑:我应该知道这个错误是愚蠢的。我在伪代码上写了(3 x 1)= n,只是没有发现错误,因为对我来说似乎没有错。感谢所有各方,我会在可能的情况下接受答复。

3 个答案:

答案 0 :(得分:1)

这是无效的:

(3 * i) = myNum;

相反,请执行以下操作:

myNum = (3 * i);

我会这样做,并且要注意,即使最后一个也保持在1000以下:

<script>
  var i, mplesOf3;
  mplesOf3 = [];
  for (i=0; i<1000; i++){
    if (i % 3 === 0){
      mplesOf3.push(i);
    }
  }
  alert(mplesOf3);
</script>

更新(请参阅评论):

为了提高效率,您的代码也更好,这里是一个完整的修复程序,甚至可以将最后一个值控制在1000以下:

var i = 1;
var mplesOf3 = [0];
var myNum = 0;
while (myNum < 1000){
  myNum = 3 * i;
  myNum < 1000 && mplesOf3.push(myNum);
  i++;
};
alert(mplesOf3);

另一个改进是避免在每个循环中进行比较,并始终从最终数组中删除最后一项:

var i = 1;
var mplesOf3 = [0];
var myNum = 0;
while (myNum < 1000){
  myNum = 3 * i;
  mplesOf3.push(myNum);
  i++;
};
mplesOf3.pop();
alert(mplesOf3);

答案 1 :(得分:1)

您的JavaScript引擎应该告诉您语法错误(如果使用浏览器,请在Web控制台中查看)。作业的左侧一侧不能有(3 * i)这样的表达式。在JavaScript中,对=右边的事物进行评估,并将其分配给左边的事物。

您的算法还会导致推送1002,因为直到 之后,您才测试设置myNum = 3 * i的结果。

使用原始算法,但修复了以下两点:

var i = 1;
var mplesOf3 = [0];
var myNum;
while ((myNum = 3 * i) < 1000){
  mplesOf3.push(myNum);
  i++;
} // Note: No semicolon here, you don't put semicolons after blocks
  // attached to control-flow statements
console.log(mplesOf3);

此位:

while ((myNum = 3 * i) < 1000){

计算3 * i,将结果分配给myNum,然后检查该值是否为< 1000。

也就是说,在增量部分使用formyNum += 3可能会更简单(变量更少,乘法更少):

var mplesOf3 = [0];
var myNum;
for (var myNum = 3; myNum < 1000; myNum += 3) {
  mplesOf3.push(myNum);
}
console.log(mplesOf3);

也没有特别好的理由对0进行这样的特殊处理,因此我很可能一开始就将其排除在数组之外并从0开始计数:

var mplesOf3 = [];
var myNum;
for (var myNum = 0; myNum < 1000; myNum += 3) {
  mplesOf3.push(myNum);
}
console.log(mplesOf3);

答案 2 :(得分:0)

也许您的错误是(3 * i) = myNum; 您只需要:myNum=(3 * i); 然后为名字分配一个值;