Перечисляются ли объектные переменные в javascript в том порядке, в котором они были добавлены?

Возможное дублирование:
Порядок элементов - для ( ... в ...) в javascript

Предположим, у вас есть такой код:

var a = {}
a.a = 1;
a.c = 2;
a.b = 3;

for (var i in a) {
    console.log(a[i]);
}

Гарантированно ли 1, 2 и 3 будут напечатаны в таком порядке? Я тестировал, и до сих пор так было, но я не знаю, всегда ли это будет правдой. Есть ли какой-нибудь браузер, который этого не делает? Нет ничего странного, вроде удаления вещей, наследования прототипов и т. Д. Просто добавление свойств к объекту.


person swampsjohn    schedule 28.05.2009    source источник
comment
Это хороший вопрос, но на самом деле это дубликат: stackoverflow.com/questions/280713/, идентификатор вопроса 280713   -  person Paolo Bergantino    schedule 28.05.2009


Ответы (2)


Все текущие браузеры, за исключением Chrome, будут перебирать свойства объекта в том же порядке, в котором они были определены.

Вот отчет об ошибке Chrome: http://code.google.com/p/chromium/issues/detail?id=883. В настоящее время он отмечен как WontFix.

person Crescent Fresh    schedule 28.05.2009
comment
Из ecma-international.org/publications/files/ECMA -ST / Ecma-357.pdf: порядок, в котором элемент привязан к членам коллекции, зависит от реализации. Думаю, было бы более целесообразно использовать массив, когда порядок важен. - person harto; 28.05.2009
comment
@harto: красивая ссылка. Эта цитата на самом деле относится к более новой для каждой конструкции цикла, хотя где-то есть похожий документ, в котором говорится то же самое для for in. В любом случае это причина, по которой V8 не будет исправлять это в ближайшее время. - person Crescent Fresh; 28.05.2009
comment
@harto: в ecmascript 5 порядок определяется как порядок вставки - person olliej; 28.05.2009
comment
Позиция Google по этому поводу нехарактерно непонятна - см. Комментарии к ошибке 16 и 17 :) Надеюсь, ecma5 мотивирует их исправить это раньше, чем позже. - person annakata; 28.05.2009
comment
ollieJ, стандарт Ecmascript 5, который я скачал и просмотрел, похоже, говорит об обратном: что механика и порядок перечисления свойств ... не указаны. - person user240515; 08.04.2011

В моей текущей версии Chrome (2.0.172.28) тестовый пример Джона Ресига проходит успешно, так что, может быть, теперь он исправлен в Chrome?

person user113611    schedule 28.05.2009