.js for循环返回每个值中的两个

时间:2015-05-11 02:51:02

标签: javascript for-loop

我正在尝试编写一个for循环,它返回每次加倍的值(1,2,4,8,16 ...)此代码可以工作但返回每个值两次(2,2,4,4,8) ,8,16,16 ......)知道我缺少什么吗?

dub = function(howMany){
for(i = 1, y = 1, z = ''; z < howMany ; i = y, y = x, z ++ ){
    x = i * 2;
    console.log(x);
}};dub(20);

4 个答案:

答案 0 :(得分:0)

我认为您可以使用Math.pow()功能

dub = function (howMany) {
    for (var i = 0; i < howMany; i++) {
        console.log(Math.pow(2, i))
    }
};
dub(20);

演示:Fiddle

如果你不想使用Math.pow(),你可以使用2个变量,1作为计数器,另一个作为乘数,如

dub = function (howMany) {
    for (var i = 0, x = 1; i < howMany; i++, x *= 2) {
        console.log(x);
    }
};
dub(20);

演示:Fiddle

另外请注意下面的@naomik所建议的,你需要将循环中使用的所有变量声明为局部作用域,否则可以在另一个作用域中修改相同的变量(如全局或闭包范围)

答案 1 :(得分:0)

好像你的for循环过于复杂:

function dub(howMany) {
    for(var i = 1, y = 1;i<=howMany;i++, y+=y) {
        console.log(y);
    }
}

我不清楚for循环的递增/递减部分或者在初始化中为z分配空字符串的原因。你的循环返回重复项的原因可以通过循环遍历变量状态来找到。

Iteration 01 - i:1 x:0 y:1 z: <empty string>
Iteration 02 - i:1 x:2 y:2 z: 1
Iteration 03 - i:2 x:2 y:2 z: 2
Iteration 04 - i:2 x:4 y:4 z: 3
Iteration 05 - i:4 x:4 y:4 z: 4
Iteration 06 - i:4 x:8 y:8 z: 5
Iteration 07 - i:8 x:8 y:8 z: 6
Iteration 08 - i:8 x:16 y:16 z: 7
Iteration 09 - i:16 x:16 y:16 z: 8
Iteration 10 - i:16 x:32 y:32 z: 9

请注意,将y反向i然后x再分配给y等的方式是不必要的。希望我已经回答了你的问题,因为你可能还有其他要求没有共享,需要将这些值链接起来,而不仅仅是如上所述创建一个双循环。

这是一个有效的JSFiddle:https://jsfiddle.net/f39jd848/

答案 2 :(得分:-1)

别介意所有这些答案显示如何更简单地编写代码。要回答你的问题,这里的操作顺序为你提供了两个相同的控制台日志。

供参考:

dub = function(howMany){
for(i = 1, y = 1, z = ''; z < howMany ; i = y, y = x, z ++ ){
    x = i * 2;
    console.log(x);
}};dub(20);

tl; dr:因为i的值在最终表达式中更新为y之前y已更新为x(结果为循环中的表达式)。循环的2次迭代必须在i等于x的新值之前通过。

完整的演练(希望没有错误,我累了)

  1. 在第一次执行此循环期间,不会计算最终表达式(在第二个;之后)。 i等于1,因此为x分配值2(1 * 2)。
  2. 评估最终表达式。 i被赋予y的值1i与第一个循环相同的值)。我为y分配了值x,即2
  3. 再次评估for循环的内容。由于i已再次分配1,结果相同,并再次记录2x再次等于2
  4. 评估最终表达式。 i的值已分配y(现在2来自第2步),y的值已分配x(仍为2从步骤2)。
  5. 循环再次执行... i现在包含值2,因此为x分配值4,并将4记录到控制台。
  6. 最终表达式:i的值为y(仍为2),然后y的值为x(现在{ {1}})。
  7. 这种模式继续......

答案 3 :(得分:-2)

如果你将它放在for循环的顶部,它将跳过第二次迭代:

if (z%2==1) continue;