奇怪的寻找Javascript for循环

时间:2015-03-28 11:04:09

标签: javascript loops for-loop

我从未见过代码中使用的 for( ; i-- ; ) 之类的JavaScript循环:

uid: function (len) {
    var str = '';
    var src = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var src_len = src.length;
    var i = len;

    for (; i--;) {
        str += src.charAt(this.ran_no(0, src_len - 1));
    }

    return str;
}

我理解这种行为,但如果有人可以分享一些有关此类for循环的见解,我希望如此。

6 个答案:

答案 0 :(得分:32)

这是for-loop构造的语法:

  

for([ initialization ]; [ condition ]; [ final-expression ])
  语句

在您的情况下for (; i--;) {

  • 没有变量被初始化,因为var i = len;早先已经初始化,所以不需要。
  • 条件部分将是真实的,直到i变为0,然后循环将终止。 i--在每次迭代之前执行,由于--运算符,它最终将变为0,因此它是假的,循环将停止。
  • 由于i在循环的条件部分递减,因此也不需要final-expression。另一种说法是:由于i未在循环中使用,因此无论我们是在每次循环迭代之前还是在每次循环迭代之后减少它都无关紧要。

话虽如此,最好避免像上面那样编写循环,因为它非常混乱且难以阅读。更喜欢传统的for循环符号。

答案 1 :(得分:10)

来自MDN - for - Optional for expressions

  

for循环开头的所有三个表达式都是可选的。

您不必在for循环中指定所有三个表达式。例如,for (;;)是编写无限循环的常见问题。

在您的情况下,while(i--)也会这样做,没有充分理由写for (; i--;)

我还注意到for(var i=len;i>=0;i--)更强大 - 它可以保护您免受len否定的影响。

答案 2 :(得分:4)

这可以改写为

uid: function (len) {
    var str = '';
    var src = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var src_len = src.length;
    var i = len;

    while (i >= 0) {
        str += src.charAt(this.ran_no(0, src_len - 1));
        i = i - 1;
    }

    return str;
}
  

for语句创建一个由三个可选项组成的循环   表达式。

Javascript考虑0 == false这就是为什么在你呈现循环的情况下会运行直到i变量变为零。它将循环src字符串大小的次数。

注意:i--使用变量值然后递减它。看看以下情况:

for(;i--;) { // i = length in the condition
     // i === length - 1 here. It will not overflow the array
}

for(;i--;) { // i = 1
     // i === 0 here. It will be the last loop
}

for(;i--;) { // i == 0 == false
     // Not executed
}  

答案 3 :(得分:2)

没有错。

for(`INIT`;`TEST`;`ACTION`)
{
     `WORK`;
}

INIT(初始化)可以在循环外完成。

var i=0;
for(;i<=100;i++)
//do something

TEST部分会产生truefalse的结果。现在,在这种情况下,i的值已经过测试。直到它变为零为止。

ACTION部分通常用于更改循环变量。但你也可以将其保留或者可能将它添加到TEST部分,就像在这里完成一样。

看看这些例子将清除你的想法

var i=0;
for( i++; i++; i+=j); //No body

var i=0;
for(;;); //an infinite loop

var i;
for(i=-4;i;i++);//

即使有时WORK放置在ACTION

示例:

x的阶乘

 for(var i=1,ans=1;i<=x;ans=ans*(i++));

Which can be written this way also-


 var ans=1;
for(var i=1;i<=x;i++)
   ans=ans*i;

注意:您可以根据需要编写任何方式。只要你正确编写代码就没关系了。习惯这种形式,你会看到很多。

虽然,有时以紧凑的形式写作更好,但请记住你应该保持可读性

答案 4 :(得分:1)

那只是为了循环。在第一个分号之前,通常会声明循环中使用的变量。但在这种情况下变量,循环中使用的变量是先前声明的:

var i = len;
   ^^^
for (; i--;) {...

所以没有必要重新宣布。

在第一个分号后,循环有一个条件(即i<6i>3等)。如果条件返回false0,则退出循环。在这种情况下,当i0时,循环将被分解。它最终会发生,因为在--之后i递减它,因此不需要表达式,这是保留第二个分号后的位置。

答案 5 :(得分:0)

for循环的第一个参数已经定义,所以初始逗号用于分隔它在参数列表中的位置。