34

是否可以在 for 循环的初始化部分声明两个变量?我想对字符串的每个字符调用一个函数。

for(var i = 0, c = aString.charAt(i); i < aString.length; i++){//problem here: not itterating
    alert("c: "+c)
    func1[typeOfChar(c)]++
}

问题是字符串没有被迭代,因为c它始终是字符串的第一个字母。顺便说一句,这alert只是为了解决问题。

我很好奇,为什么声明时c不需要var关键字?

更新:让它工作。我不打算问,但我注意到仍在进行编辑,我习惯于不使用分号,因为它们是可选的。没有它们如何编写 for 循环?我不添加它们是因为我认为它越少越简单,或者它们是否提高了可读性?

4

7 回答 7

36

您想c在每次迭代时进行更改,而不是在循环开始时声明它,尝试

var i,c;
for(i = 0,c=aString.charAt(0); i < aString.length; ++i, c = aString.charAt(i)){
    alert("c: "+c)
    func1[typeOfChar(c)]++
}

对于它的价值,我认为它不会产生非常可读的代码,我会把它放在第一行。

以下是有关您正在使用的逗号运算符的一些信息。

另请注意,对于 for 循环,javascript 没有块范围,因此您实际上是在当前范围的顶部声明i和(这通常是当前函数的顶部,或全局范围的顶部)。c

这是一个小提琴:http: //jsfiddle.net/maWua/

于 2013-02-04T21:49:46.240 回答
31

在 for 循环中包含多个递增变量而无需嵌套的简单方法。这个例子声明了 3 个变量。

for (var i = 0, j = 1, n = 2; i < 50, n < 50; i = i + 3, j = j + 3, n = n + 3){
    console.log("variable i: " + i);
    console.log("variable j: " + j);
    console.log("variable n: " + n);
}

在此处查看代码笔

于 2017-01-08T18:22:57.460 回答
1

在这种情况下,因为c仅依赖于i(和一个不变量)并且它用于循环的条件,我建议将其从循环构造中删除:

// (Keep variable hoisting in mind)
for(var i = 0; i < aString.length; i++){
    var c = aString.charAt(i);
    alert("c: "+c);
    // ..
};

(原来的问题是它从未更新过 的值c。)

于 2013-02-04T21:53:22.413 回答
1

您应该只放置c = aString.charAt(i);在循环主体内。

例如:

for(var i = 0; i < aString.length; i++){
    c = aString.charAt(i);
    alert("c: "+c);
    func1[typeOfChar(c)]++ 
}
于 2013-02-04T21:56:24.757 回答
0

这里:

c = aString.charAt(i)

i始终为零,因此不会按预期工作。初始化发生一次,当 i 刚刚被初始化为0.

于 2013-02-04T21:52:08.953 回答
0

是的,可以通过使用multiplevar语句,并且您成功了。但是,在初始化语句中只分配一次不会使其改变。

您需要在循环之前和每次循环之后执行一次

for (var i=0, c=str.charAt(i); i<str.length; c=str.charAt(++i)) …

或者你在每次转入条件之前都这样做

for (var i=0, c; c=str.charAt(i), i<str.length; i++) … // comma operator
for (var i=0, c; c=str.charAt(i); i++) … // empty string as condition

或者只是将它移动到循环内

for (var i=0, c; i<str.length; i++) { c=str.charAt(i); … }
于 2013-02-04T21:53:24.103 回答
0

另一种选择是使用while,在某些情况下它更清晰:

var i = 0;
while(i < aString.length){
   c = aString.charAt(i);
   alert("c: "+c)
   func1[typeOfChar(c)]++
   i++;
}
于 2017-12-21T03:28:14.167 回答