爲什麼總是打印UNDEFINED數組[j]的第一次迭代?Javascript - For循環鍵未定義僅用於第一次迭代?
var array = [1,2,3,4,5]
for (i in array) {
console.log("array[i]:" +array[i]);
for (j=i+1; j<array.length-1;j++) {
console.log("array[j]:"+ array[j]);
}
}
爲什麼總是打印UNDEFINED數組[j]的第一次迭代?Javascript - For循環鍵未定義僅用於第一次迭代?
var array = [1,2,3,4,5]
for (i in array) {
console.log("array[i]:" +array[i]);
for (j=i+1; j<array.length-1;j++) {
console.log("array[j]:"+ array[j]);
}
}
這是因爲i
包含一個字符串值,而不是數字。
設置j
到i+1
使其成爲"0"+1
而不是0+1
,因此是"01"
。由於array
中沒有鑰匙"01"
,因此您得到undefined
。
當執行j++
時,它會將"01"
轉換爲1
並增加它,以便循環將按預期運行到最後。
對於外循環中的下一次迭代,您得到j = "11"
,並且當它與數組長度比較時,它將跳過內循環。對於外循環中的其餘迭代,內循環將被跳過,因爲j
將在數組外部開始。
當使用foreach
語法在陣列上,它實際上是拉動該陣列的索引到i
變量作爲一個字符串值。執行j = i + 1
將j
變量設置爲字符串值01
,對於該值array
中的該密鑰沒有對應的值,因此它返回undefined。
在子循環的第一次迭代之後,j++
會將其轉換爲整數並返回數組索引處的正確值。
有關foreach
語法的更多信息,請參閱this question。
這是因爲你在數組上使用了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
環路,當然還有while
和do
環路需要。
謝謝,這是有道理的 – Myclamm
檢查'i'的值,你會很容易發現你的錯誤。 – Sirko