For-Each Loop AS3:方向是否有保证?

时间:2009-03-06 14:07:58

标签: actionscript-3 iteration foreach

我想知道for-each和for-in循环中AS3中的Array,Dictionary和Object类型的迭代顺序。还有哪些因素可以改变这些循环类型组合的迭代顺序?

例如,我假设在Array类型上使用for-each总是从第一个元素移动到最后一个元素。 For-each不能在Dictionary上使用,那么如何使用for-in循环确定顺序?

3 个答案:

答案 0 :(得分:8)

正如Colin Moock在Essential Actionscript 3.0中所述,除非枚举XML或XMLList对象,否则无法保证每个in循环的顺序;

Click here for Colin Moock's words from his book.

有讨论here的解决方法,但老实说,如果你需要保证订单,那么只需使用常规的旧for循环并让它迭代(length,numChildren等)次数。

答案 1 :(得分:5)

你的意思是每个循环的for (x in y)类型? AS3规范说for for“具有与ECMA-262 edition 3和E4X中定义的相同的语法和语义。”

ECMA-262,第12.6.4节规定“枚举的顺序是由对象定义的” - 换句话说,它取决于你是在迭代列表,字典,数组等。 / p>

我希望希望大多数集合的文档都会明确说明枚举顺序(或者订单未定义),但我没有检查过......

编辑:不幸的是,规范声明“枚举属性[...]的机制是依赖于实现的。”我在Array文档中看不到任何指定顺序的内容。说实话,这有点令人不满意:(

答案 2 :(得分:2)

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

尝试上述操作