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

Javascript 为什么for循环有时会跳过一些迭代?,javascript,loops,for-loop,while-loop,Javascript,Loops,For Loop,While Loop,在下面的函数中,for循环有时跳过一次迭代 在一些罕见的情况下,我还发现它跳过了两次迭代。 这有时会破坏我的代码,如果我对for循环的理解仍然不完整,可能会影响我未来的代码 我进一步研究了这一问题,并尝试了同样的while循环,发现如果使用while循环,这个问题不会发生 为什么for循环有时会跳过一些迭代 function forLoopString(len) { var string = 'abcdefghijklmnopqrstuvwxyz0123456789'; var

在下面的函数中,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;
}
用于loopString(len)的函数 { 变量字符串='abcdefghijklmnopqrstuvwxyz0123456789'; 变量字符=“”, 随机字符串=“”; 对于(变量i=0;i

显示的循环不会“跳过”任何迭代,而是按照指示从
[0,len)
进行迭代

但是,
charAt
的一个负参数使它看起来像是“跳过”,因为
的“foo”.charAt(-1)==“
。对于任何超出范围的对象,相同的空字符串结果适用于:

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

生成始终有效索引的更正只会是
Math.floor(Math.random()*string.length)
,而不使用-1

虽然这有点偏颇(对于真正关心的人来说),但这是“正确的”,因为Math.random返回的数字范围是
[0,1)
。因此
Math.random()*len
返回
[0,len)
中的值,并在地板后的相同间隔内作为整数返回

此外,选择更有用的变量名也很好。正如Ed指出的,+0是不相关的,因为
Math.floor
返回一个(整数)数。

显示的循环不会“跳过”任何迭代,而是按照指令从
[0,len)
进行迭代

但是,
charAt
的一个负参数使它看起来像是“跳过”,因为
的“foo”.charAt(-1)==“
。对于任何超出范围的对象,相同的空字符串结果适用于:

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

生成始终有效索引的更正只会是
Math.floor(Math.random()*string.length)
,而不使用-1

虽然这有点偏颇(对于真正关心的人来说),但这是“正确的”,因为Math.random返回的数字范围是
[0,1)
。因此
Math.random()*len
返回
[0,len)
中的值,并在地板后的相同间隔内作为整数返回


此外,选择更有用的变量名也很好。正如Ed所指出的,+0是不相关的,因为
Math.floor
返回一个(整数)数。

随机数有时是负数,这就是为什么在这些情况下,字符会从
随机字符串中跳过


例如,使用
Math.abs

随机数有时是负数,这就是为什么在这些情况下,字符会从
randomString
跳过的原因

例如使用
Math.abs

您的问题在这里:

character = string.charAt(Math.floor(Math.random() * string.length-1) + 0); 
如果您的rand小于0,您将得到一个负数,因此,您将不会得到任何字符。您必须封装字符串。length-1如下所示:

character = string.charAt(Math.floor(Math.random() * (string.length-1)));
更新的小提琴:

永远记住:乘法优先!!

编辑:
string.length是36
,您不需要将1减去,只需将其相乘

character = string.charAt(Math.floor(Math.random() * string.length));
你的问题是:

character = string.charAt(Math.floor(Math.random() * string.length-1) + 0); 
如果您的rand小于0,您将得到一个负数,因此,您将不会得到任何字符。您必须封装字符串。length-1如下所示:

character = string.charAt(Math.floor(Math.random() * (string.length-1)));
更新的小提琴:

永远记住:乘法优先!!

编辑:
string.length是36
,您不需要将1减去,只需将其相乘

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

为什么
+0
?似乎不必要为什么
+0
?似乎不必要这将永远不会选择最后一个字符,因为random是
[0,1)
。这将永远不会选择最后一个字符,因为random是
[0,1)
。感谢您的澄清。它完全按照预期工作。“有用的变量名”…如何?@Devang好吧,我知道它是一个“字符串”!(这可以看作是的一种形式)让变量名告诉我它代表什么。类似于
随机集
字母表
(不严格地与“a-Z”绑定)英语字母表,而不是结果来自的字母表)-尽管还有很多其他名称,而且可能更好。这种更改将使变量名“添加语义值”,从而“自我文档”代码。从一开始它似乎有点复杂,但肯定会尝试实现它。谢谢!谢谢你的澄清。它完全按照预期工作。“有用的变量名”…比如如何?@Devang好吧,我知道它是一个“字符串”!(这可以看作是让变量名告诉我它代表什么。类似于
randomSet
alphabet
(当然,不是严格地与“A-Z”英语字母表绑定,而是结果来自的字母表)-尽管还有很多其他名称,而且可能更好。这一更改将使变量名“添加语义值”,从而“自我记录”代码。一开始似乎有点复杂,但肯定会尝试实现它。谢谢!