2014-03-04 71 views

回答

2

這是因爲i包含一個字符串值,而不是數字。

設置ji+1使其成爲"0"+1而不是0+1,因此是"01"。由於array中沒有鑰匙"01",因此您得到undefined

當執行j++時,它會將"01"轉換爲1並增加它,以便循環將按預期運行到最後。

對於外循環中的下一次迭代,您得到j = "11",並且當它與數組長度比較時,它將跳過內循環。對於外循環中的其餘迭代,內循環將被跳過,因爲j將在數組外部開始。

1

當使用foreach語法在陣列上,它實際上是拉動該陣列的索引到i變量作爲一個字符串值。執行j = i + 1j變量設置爲字符串值01,對於該值array中的該密鑰沒有對應的值,因此它返回undefined。

在子循環的第一次迭代之後,j++會將其轉換爲整數並返回數組索引處的正確值。

有關foreach語法的更多信息,請參閱this question

1

這是因爲你在數組上使用了for...in循環。當您使用for...in時,數組索引被視爲散列鍵,因此被視爲字符串。所以當你開始你的第二個循環時,你將j設置爲i + 1,那麼你確實將j設置爲「01」。由於沒有array["01"],您在第一次迭代時會得到未定義的值。在第二次迭代時,您通過將j設置爲length - 1將其轉換回數字,因此可以使用它來訪問數組索引。試試下面這個例子:

var array = [1,2,3,4,5] 
for (i in array) { 

    console.log(typeof i); 
    console.log("array[i]:" +array[i]); 

    for (j=i+1; j<array.length-1;j++) { 

     console.log(j); 
     console.log("array[j]:"+ array[j]); 
    } 
} 

你解決這個問題是不使用for...in循環使用數組的方式。只要堅持使用正常的for環路,當然還有whiledo環路需要。

+0

謝謝,這是有道理的 – Myclamm