Подтвердить что ты не робот

Для каждой петли AS3: гарантировано ли направление?

Я хотел бы знать порядок итераций для массивов, словарей и типов объектов в AS3, как для циклов for-each, так и for-in. Также какие факторы могут изменить порядок итераций этих комбинаций типа цикла?

Например, я предполагаю, что использование типа for-each по типу Array всегда перемещается от первого элемента к последнему. Для каждого не может использоваться в словаре, так как порядок определяется с помощью цикла for-in?

4b9b3361

Ответ 1

Вы имеете в виду тип for (x in y) для каждого цикла? Спецификация AS3 говорит, что для циклов "имеют тот же синтаксис и семантику, что и в ECMA-262 edition 3 и E4X".

В ECMA-262 в разделе 12.6.4 указано, что "порядок перечисления определяется объектом" - другими словами, он будет зависеть от того, повторяетесь ли вы через список, словарь, массив и т.д.

Я надеюсь, что документация для большинства коллекций будет явно указывать порядок перечисления (или что порядок не определен), но я не проверял...

EDIT: К сожалению, спецификации показывают, что "механика перечисления свойств [...] зависит от реализации". Я не вижу ничего в документах Array, чтобы указать порядок. Честно говоря, это немного неудовлетворительно: (

Ответ 2

Как указано в Essential Actionscript 3.0 от Colin Moock, порядок a для каждого из циклов не гарантируется, если не перечислять объект XML или XMLList;

Нажмите здесь для слов Колина Мока из его книги.

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

Ответ 3

Порядок оценки изменился в AS3.0. Ранее в AS 1.0 и 2.0 порядок оценки основывался на порядке, в котором были добавлены объекты. Теперь, в 3.0, весь цикл поддерживает порядок массива. Попробуйте фрагмент:

var a:Array = new Array();
a[ 1 ] = 'first';
a[ 0 ] = 'second';

for (var key:String in a) 
    trace( key + ': ' + a[ key ] );

Попробуйте выше с AS3.0 и AS1.0/2.0