цикл в Chrome - баг или фича?

Beavis

Banned
цикл в Chrome - баг или фича?

в javascript есть объект
var obj = {200: 'value1', 100: 'value2', 300: 'value3'};
почему хром при проходе в цикле по этому объекту идет не порядку 200, 100, 300 как определено, а по возрастанию индексов? (100, 200, 300)

for (var i in obj) {}
 

dimagolov

Новичок
ну посмотри стандарт, есть ли там что-то определенное о том, в каком порядке for ( in ) должен вытягивать свойства.

кстати, если часть свойств определяется прототипом, а часть конструктором, то по твоему которые из них раньше оказаться должны? :)

п.с. можно сказать, что такая реализация эмулирует ассоциативный массив (на сколько это применимо к JS), так как в JS порядок элементов массива определяется только величиной индекса, а не порядком их добавления.
 

Beavis

Banned
так в том то и дело! я его упорядочил как мне надо! а хром идет по возрастанию ключа... в файрфоксе и ие всё норм...

да и в ассоциативном массиве php - foreach обходит его в том порядке в котором он определен а не по возрастанию ключей...
 

флоппик

promotor fidei
Команда форума
Партнер клуба
я не успел поправиться ))
читал стандарт. однозначного определения поведения нет.
 

dimagolov

Новичок
флоппик, спасибо.

Стандарт JS вообще очень гибкая штука, там многое на откуп реализации. Ну и еще конкретные реализации не всегда точно придерживаются стандарта. А уж кишки реализации и вовсе сильно разные, тесты производительности тому лучшее подтверждение.

да, на уровне слухов, когда-то читал, что цикл for ( in ) это удар по производительности.
 

Beavis

Banned
Автор оригинала: dimagolov
да, на уровне слухов, когда-то читал, что цикл for ( in ) это удар по производительности.
так это уже производительность клиента))))

и ладно если б это был массив, так я про объект говорю, там обычный for ( ; ; ) не покатит(
 

fixxxer

К.О.
Партнер клуба
>> почему хром при проходе в цикле по этому объекту идет не порядку

потому же, почему при SELECT-запросе без ORDER BY в разных СУБД будет разный порядок строк.
или потому же, почему i++ + i++ даст разные результаты в разных компиляторах.

завязываться на реализацию допустимо, когда она в природе всего одна (как в случае с php); когда речь идет о куче разных реализаций, то надо ориентироваться по стандарту - и все равно проверять, не отклоняется ли от него конкретная реализация (как всеми любимый MSIE).
 

Beavis

Banned
Так везде реализация яваскрипта разная... Вообще на него чтоль не завязываться?
Я просто подумал, может это баг и стоит им написать чтоб исправили?)) ибо из-за такой реализации становится очень проблематично работать с преобразованными в json ассоц. массивами из php...

P.S. кстати, i++ + ++i прикольнее)))
 

ksnk

прохожий
Можно "индексы" сделать текстовыми и непохожими на числа.
var obj = {'_200': 'value1', '_100': 'value2', '_300': 'value3'};
 

vovanium

Новичок
Beavis
Вытяни ключи в отдельный массив, отсортируй как хочешь, а потом доставай по этому массиву, нужные свойства объекта.
 

fixxxer

К.О.
Партнер клуба
>> ибо из-за такой реализации становится очень проблематично работать с преобразованными в json ассоц. массивами из php...

в php массивы это на самом деле жуткая мешанина всякого. когда привыкаешь - удобно, но классически список и хэш/словарь/карта это две разные структуры данных. и в хэше порядок не определен, просто потому что таков хэш по его определению.
 

dimagolov

Новичок
>> ибо из-за такой реализации становится очень проблематично работать с преобразованными в json ассоц. массивами из php...

Кстати, у тебя концептуальная проблема в том, что ты порываешься на JS писать как на PHP и аналогично юзать объекты как PHP массивы. Надо просто не передавать через JSON такие структуры, причем полагаясь на порядок следования элементов в них. Отдавай JS-у те структуры, которые легко на нем обрабатывать.
 

fixxxer

К.О.
Партнер клуба
ну вообще тоже мне нашли проблему
[
{ 'id': 200, 'value': 'foo' },
{ 'id': 100, 'value': 'bar' }
]
 

Beavis

Banned
fixxxer
Ага, только представь что это массив из тысячи объектов и тебе постоянно надо находить нужный элемент зная его id

dimagolov
Да в том то и дело что такую структуру очень легко обрабатывать, только хром это делает не так как все...


vovanium
Спасибо, хороший вариант!
 

dimagolov

Новичок
Beavis, зачем тебе порядок? если надо находить зная id, то тебе никакие циклы не нужны.
 

Beavis

Banned
dimagolov
порядок нужен для того чтоб на экран вывести записи в определенном порядке, а потом уже работать с ними (а для этого надо иметь возможность зная идентификатор - обратиться к объекту)
 
Сверху