我从未见过代码中使用的 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循环的见解,我希望如此。
答案 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
部分会产生true
或false
的结果。现在,在这种情况下,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
。
示例:
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<6
,i>3
等)。如果条件返回false
或0
,则退出循环。在这种情况下,当i
为0
时,循环将被分解。它最终会发生,因为在--
之后i
递减它,因此不需要表达式,这是保留第二个分号后的位置。
答案 5 :(得分:0)
for循环的第一个参数已经定义,所以初始逗号用于分隔它在参数列表中的位置。