2013-02-04 117 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++; 
}