2012-03-06 99 views
2

我正在使用Titanium來構建一些移動應用程序,我注意到這會給我一個不期待的結果。Javascript for循環變量「我」被視爲一個字符串?

data = ['a','b', 'c','d']; 

for (var i in data){ 
    Ti.API.debug(i+1); 
}; 

這將打印:01,11,12,13

這是不是特別鈦或者是一般的Javascript?

爲什麼'i'不被視爲整數?我很困擾。

感謝您的幫助。

+0

你是不是指01,11,21,31? – 2012-03-06 20:29:43

+0

你想要的輸出是什麼?它是'1,2,3,4'還是'a1,b1,c1,d1'還是別的? – artlung 2012-03-06 20:34:13

+0

有關JavaScript中'for..in'的更多信息以及它如何導致問題:http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ – artlung 2012-03-06 20:35:14

回答

5

這並不直接回答你的問題,但如果你是通過一個數組,你應該使用for (var i in data)循環。這遍歷一個對象的所有成員,包括方法,屬性等

你想要做的是這樣的:

for (var i=0, item; i<data.length; i++) { 
    item = data[i]; 
} 
+0

我明白了。感謝您的提示。 – 2012-03-07 15:50:09

0

試試這個:

data = ['a','b', 'c','d']; 

for (var i in data){ 
    Ti.API.debug(i*1+1); 
}; 

乘我X 1將迫使它認識到它作爲數字。

4

data是一個數組,所以使用一個for循環,而不是一個for-in循環:

var data = [ ... ]; 
var i; 

for (i = 0; i < data.length; i += 1) { 
    Ti.API.debug(i + 1); 
} 

或者,也可以使用forEach陣列的方法:

data.forEach(function (val, i) { 
    Ti.API.debug(i + 1); 
}); 
+0

因此,for-in循環只能用於不是數組的對象? – 2012-03-07 15:49:37

+0

@LeonardoAmigoni是的。但是,我根本不使用「for-in」。當我想遍歷一個對象的屬性時,我使用Object.keys(myObject).forEach(...);'。我這樣做,而不是'for-in',因爲'for-in'也遍歷繼承的屬性,這是我不想在大多數情況下做的事情。 – 2012-03-07 18:38:45

0

試試:

Ti.API.debug(parseInt(i)+1); 
+1

這不是事實。一個'for'循環遍歷一個對象的屬性*名稱*,而不是它的值。對於數組,屬性名稱是索引。 – 2012-03-06 20:33:53

+0

@FelixKling,很好,我完全看錯了!編輯爲不顯示不正確的答案。 – Matt 2012-03-06 20:38:47

1

y之所以y ou看到這種行爲是當在陣列上使用for-in時,i的類型是string而不是int。因此+正在做字符串連接而不是加法。如果你希望它是數值,然後使用一個for循環

for (var i = 0; i < data.length; i++) { 
    Ti.API.debug(i + 1); 
} 
0

你可以做

data = ['a','b', 'c','d']; 

for (var i in data){ 
    console.log(parseInt(i)+1); 
}; 

但它是不建議。因爲在Javascript中,for..in循環用於鍵值對(Objects)。因此,如果將它與數組一起使用,則每個索引都將轉換爲字符串作爲鍵。

所以總是使用for(i = 0; i < length; i++)與數組。

0

這是因爲JavaScript處理for-each循環這種方式。

其他語言for(i in datas)將循環遍歷每個數據。

但在JavaScript 我將有索引值而不是數據。所以你必須通過數據[i]得到數據。