是否可以在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循环?我不添加它们,因为我认为它更简单,或者它们是否提高了可读性?
答案 0 :(得分: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循环的块范围,因此您实际上在当前范围的顶部声明i
和c
(这通常是当前范围的顶部)函数,或全局范围的顶部)。
这是一个小提琴:http://jsfiddle.net/maWua/
答案 1 :(得分: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
答案 2 :(得分: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
的值。)
答案 3 :(得分:1)
您应该将c = aString.charAt(i);
放在循环体内。
例如:
for(var i = 0; i < aString.length; i++){
c = aString.charAt(i);
alert("c: "+c);
func1[typeOfChar(c)]++
}
答案 4 :(得分:0)
下面:
c = aString.charAt(i)
i
始终为零,因此无法按预期工作。初始化发生一次,当你刚刚初始化为0
时,你试图在init期间获取char。
答案 5 :(得分: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); … }
答案 6 :(得分:0)
另一种选择是使用while
,在某些情况下更清楚:
var i = 0;
while(i < aString.length){
c = aString.charAt(i);
alert("c: "+c)
func1[typeOfChar(c)]++
i++;
}