2012-06-07 18 views
1

這裏你可以看到一個工作示例:爲什麼在循環數組時,JavaScript對象輸出爲「未定義」?

http://jsfiddle.net/bwhitney/ZDHp4/1/

我想在JavaScript中創建對象的數組。當我嘗試訪問對象時,我得到「未定義」輸出。下面是一些示例代碼:

var dates = []; 

var beginDate1 = new Date("01/01/01"); 
var endDate1 = new Date("02/02/02"); 
var beginDate2 = new Date("03/03/03"); 
var endDate2 = new Date("04/04/04"); 

// this outputs the correct dates 
alert("before: " + beginDate1 + "--" + endDate1); 
alert("before: " + beginDate2 + "--" + endDate2); 

dates.push({ 
    "beginDate": beginDate1, 
    "endDate": endDate1 
}, { 
    "beginDate": beginDate2, 
    "endDate": endDate2 
}); 

var date; 
for (date in dates) { 
    // this outputs "date: undefined--undefined" 
    // why would that be? 
    alert("after: " + date.beginDate + "--" + date.endDate); 
} 

回答

5

for ... in循環在JavaScript給你的對象,而不是值。

你真的應該使用,但是數字索引:

for (var date = 0; date < dates.length; ++date) { 
    alert("date " + date + " is: " + dates[date]); 
} 

遍歷鍵與for ... in不會拿起只有數字索引的數組元素;它對數組進行操作,就像它們是普通的普通對象一樣。其他屬性也將被提取,再加上你甚至不能保證它會按照數字順序升序!

+0

我明白了。所以使用數組索引的for循環就是我真正想要的東西。感謝關於升序數字順序的提示。 –

0

當使用for..in循環時,變量被賦予鍵值,而不是值!

for (date in dates) { 
    alert('after: ' + dates[date].beginDate ...); 
} 
1

每個循環的常見錯誤。 datedates的索引。你應該寫:dates[date].beginDate