是否可以在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循环?我不添加它们,因为我认为它不那么简单,或者它们是否提高了可读性?
你希望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/
在没有嵌套的情况下在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
在这种情况下,因为c
仅依赖于i
(和一个不变量)并且它不是循环的条件,我建议从循环结构中删除它:
// (Keep variable hoisting in mind)
for(var i = 0; i < aString.length; i++){
var c = aString.charAt(i);
alert("c: "+c);
// ..
};
(原始问题是它从未更新过c
的值。)
你应该把c = aString.charAt(i);
放在循环体内。
例如:
for(var i = 0; i < aString.length; i++){
c = aString.charAt(i);
alert("c: "+c);
func1[typeOfChar(c)]++
}
是的,有可能通过使用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); … }
这里:
c = aString.charAt(i)
i
始终为零,所以它不会按预期工作。初始化发生一次,当你刚刚初始化为0
时,你试图在init期间获取char。
另一个选择是使用while
,在某些情况下,它更清晰:
var i = 0;
while(i < aString.length){
c = aString.charAt(i);
alert("c: "+c)
func1[typeOfChar(c)]++
i++;
}