Петля For-Each AS3: направление гарантировано?
-
03-07-2019 - |
Вопрос
Я хотел бы знать порядок итераций для типов Array, Dictionary и Object в AS3 как для циклов for-each, так и for-in. Кроме того, какие факторы могут изменить порядок итераций этих комбинаций типов циклов?
Например, я предполагаю, что использование for-each для типа Array всегда перемещает от первого элемента к последнему. For-each нельзя использовать в словаре, так как порядок определяется с помощью цикла for-in?
Решение
Вы имеете в виду тип for (x in y)
для каждого цикла? Спецификация AS3 гласит, что для циклов "имеют тот же синтаксис и семантику, что определены в ECMA-262, выпуск 3 и E4X".
ECMA-262, раздел 12.6.4, утверждают, что «порядок перечисления определяется объектом» - другими словами, это будет зависеть от того, перебираете ли вы список, словарь, массив и т. д.
Я бы надеялся , что в документации для большинства коллекций будет явно указан порядок перечисления (или что порядок не определен), но я не проверял ...
РЕДАКТИРОВАТЬ: К сожалению, спецификации утверждают, что «механизм перечисления свойств [...] зависит от реализации». Я не вижу ничего в документах Array, чтобы указать порядок. Это немного неудовлетворительно, если честно: (
Другие советы
Как указано в Essential Actionscript 3.0 Колином Моком, порядок a для каждого цикла in не гарантируется, если не перечислить объект XML или XMLList;
Нажмите здесь, чтобы найти слова Колина Мука из его книги. р>
Есть обходные пути, о которых говорилось > здесь , но, если честно, если вам нужно гарантировать порядок, то просто используйте обычный старый цикл for и выполняйте его итерацию (length, numChildren и т. д.) несколько раз.
Порядок оценки изменился в 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