在for循环中声明两个变量

问题描述 投票:22回答:7

是否可以在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循环?我不添加它们,因为我认为它不那么简单,或者它们是否提高了可读性?

javascript
7个回答
23
投票

你希望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)]++
}

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

以下是您正在使用的on the comma operator的一些信息。

另请注意,javascript没有for循环的块作用域,因此您实际上在当前作用域的顶部声明了ic(这通常是当前函数的顶部,或全局作用域的顶部)。

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


9
投票

在没有嵌套的情况下在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);
}

见codepen here


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的值。)


1
投票

你应该把c = aString.charAt(i);放在循环体内。

例如:

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

0
投票

是的,有可能通过使用multiple var statement,你成功了。但是,在初始化语句中仅为其分配一次不会使其更改。

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

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); … }

0
投票

这里:

c = aString.charAt(i)

i始终为零,所以它不会按预期工作。初始化发生一次,当你刚刚初始化为0时,你试图在init期间获取char。


0
投票

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

var i = 0;
while(i < aString.length){
   c = aString.charAt(i);
   alert("c: "+c)
   func1[typeOfChar(c)]++
   i++;
}
© www.soinside.com 2019 - 2024. All rights reserved.