2012-08-01 52 views
2

盡我的理解,代碼的Javascript「的(我在陣列)」設置我到最後一個索引

var a = new Array("a","b","c"); 
var out = ""; 
for(i in a) 
    out += i+":"+a[i]+"\n"; 

應該着手

0:a 
1:b 
2:c 

吧?

好吧,我有我的一個項目下面的代碼片段:

for(i in player.neededItems) 
{ 
    debug(i+":"); 
    if(!player.hasItem(player.neededItems[i].type)) 
    itemsRemaining.push(player.neededItems[i]); 
    debug(i+"<br />"); 
} 
  • 調試(x)的僅僅是追加x到ID爲「調試」一個div的內容的功能。
  • player.neededItems是一個對象數組。
  • itemsRemaining是一個以前爲空的數組。
  • player.hasItem無論是否返回玩家都有物品。

好的。所以這就是它變得奇怪的地方。在for循環中,'i'僅用作數組的索引。它沒有任何修改。然而,「調試」中的輸出如下:

0:3 
1:3 
2:3 
3:3 

爲什麼'我'正在改變?! player.neededItems不會在任何函數或任何東西中被修改。我不知道發生了什麼事。但是,當我切換

for(i in player.neededItems) 

for(i = 0; i < player.neededItems.length; i++) 

一切正常。

所以我錯過了一些關於'for(i in a)'語法的功能嗎?或者我偶然發現了webKit中JavaScript解析器中的錯誤?或者(更可能)我會生氣嗎?

+4

嘗試'變種i',沒有'var'關鍵字提前一個可變的,我相信它是隱式聲明的全局。您的程序中可能有其他一些「i」存在干擾。 – 2012-08-01 17:03:48

+2

你不應該使用for-in迭代數組。因爲它不方便,但更糟的是它的表現非常緩慢。 – jAndy 2012-08-01 17:08:49

+2

如果有人向數組原型添加額外方法(例如Prototype庫),並且不能保證按順序遍歷鍵,則使用for-in對數組進行迭代也會中斷。相反,使用數字for循環'for(var i = 0; i hugomg 2012-08-01 17:11:15

回答

1
for(var i in player.neededItems) 
{ 
    debug(i+":"); 
    if(!player.hasItem(player.neededItems[i].type)) 
    itemsRemaining.push(player.neededItems[i]); 
    debug(i+"<br />"); 
} 
+1

請不要僅僅提供代碼,還要解釋您的解決方案。 – 2012-08-01 17:11:51

+0

他在for循環的()中添加了'var'。這工作。發生了什麼事情(正如Hunter McMillen在上面的評論中所描述的那樣)是'我'被認爲是'我'的全球實例(這讓我感到困惑,因爲我從未明確地聲明過我在全球......)在'player.hasItem'的一個循環中還有一個未聲明的'i',這導致'i'一直是不同陣列中的最後一個索引,其長度恰好爲3。 – Phildo 2012-08-01 17:41:32

相關問題