为什么for循环有时会跳过一些迭代?

时间:2015-08-08 06:05:02

标签: javascript loops for-loop while-loop

在下面的函数中,for循环有时会跳过一次迭代。

在一些罕见的情况下,我也发现它跳过了两次迭代。 如果我对for循环的理解仍然不完整,这有时会破坏我的代码,可能会影响我未来的代码。

我进一步研究了这个问题并尝试使用while循环,发现如果使用while循环,这个问题就不会发生。

为什么for循环有时会跳过一些迭代?

function forLoopString(len)
{
    var string = 'abcdefghijklmnopqrstuvwxyz0123456789';

    var character = '', 
        randomString = '';

    for (var i = 0; i < len; i++) 
    {
        character = string.charAt(Math.floor(Math.random() * string.length-1) + 0); 
        randomString += character;
    }

    if(randomString.length < len)
    {
        console.log('Less than required length!');
        randomString = randomString + '5';
    }
    return randomString;
}

JSFiddle

3 个答案:

答案 0 :(得分:3)

显示的循环赢了&#34;跳过&#34;任何迭代,但会按照[0, len)进行迭代。

然而,charAt的否定论点使它看起来像是&#34;跳过&#34;因为"foo".charAt(-1) == ""。对于String.charAt的任何越界,相同的空字符串结果成立:

  

.. 如果您提供给[charAt]的索引超出范围,JavaScript 将返回一个空字符串

产生始终有效索引的更正只是Math.floor(Math.random() * string.length)没有 -1。

虽然这有点偏颇(对于任何真正关心的人),这是正确的&#39;因为Math.random返回范围[0, 1)中的数字。因此Math.random() * len会返回[0, len)的值;在场后的同一区间内作为整数。

此外,最好选择更有用的变量名称..并且,正如Ed指出的那样+0是无关紧要的,因为Math.floor返回一个(整数)数字。

答案 1 :(得分:1)

随机数有时是负数,这就是为什么在这些情况下,某个角色是来自randomString的队长。

https://jsfiddle.net/ojbp0evz/3/

例如,使用Math.abs

答案 2 :(得分:1)

你的问题在这里:

character = string.charAt(Math.floor(Math.random() * string.length-1) + 0); 

如果您的兰特小于0,您将获得一个负数,因此,您将不会获得任何角色。你必须像这样封装你的string.length-1:

character = string.charAt(Math.floor(Math.random() * (string.length-1)));

更新了小提琴:DEMO

永远记住: MULTIPLICATIONS首先!!

编辑: string.length is 36,您不需要将1减去它,只需乘以左

character = string.charAt(Math.floor(Math.random() * string.length));