2012-06-07 2 views
1

Вы можете увидеть рабочий пример здесь:Почему объекты javascript выводятся как «undefined» при переходе через массив?

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

Я пытаюсь создать массив объектов в JavaScript. Когда я пытаюсь получить доступ к объектам, я получаю вывод «undefined». Вот некоторые примеры кода:

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

Общая ошибка в каждом цикле. date - индекс dates. Вы должны написать: dates[date].beginDate.

Смежные вопросы