2013-02-04 131 views
11

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

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

问题是字符串不是在这个意义上c被itterated始终是字符串的第一个字母。顺便说一句,alert只是用于解决问题的目的。

我很好奇,为什么c不需要var关键字被宣布时?

UPDATE:得到它的工作。我不会问,但我注意到编辑仍在进行中,我习惯于不使用分号,因为它们是可选的。如何在没有它们的情况下编写for循环?我不添加它们是因为我认为它越简单,或者它们是否提高可读性?

+1

遗憾的是密集的,但不能你只要把'C = ASTRING .charAt(i)'在for循环的第一行? –

+1

你试过了什么?你有代码工作吗?如果不是,你看到了什么错误? –

+2

@JasonHall用户与1000代表,回答了11个问题,并有很多排名很好的问题。我认为社区已经表现出足够的信心让这个用户假设他尝试过。 –

回答

18

你想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/

+0

这不起作用。 – Bergi

+0

@Bergi你是正确的,我没有初始化C在第一次迭代,JavaScript中的循环确实是基于0的。我做了一个编辑。 –

+0

顺便说一下,OP没有使用逗号运算符。 – Bergi

0

这里:

c = aString.charAt(i) 

i始终为零,因此它不会像预期的那样工作。初始化发生一次,并且您在尝试在初始化期间获取char时,我刚初始化为0

+0

'i ++'应该改变'i'的值。 – 2013-02-04 21:58:17

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

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

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

例如:

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

简单的方法包括循环在多变量递增不筑巢。这个例子声明了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

0

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

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