我想知道for-each和for-in循环中AS3中的Array,Dictionary和Object类型的迭代顺序。还有哪些因素可以改变这些循环类型组合的迭代顺序?
例如,我假设在Array类型上使用for-each总是从第一个元素移动到最后一个元素。 For-each不能在Dictionary上使用,那么如何使用for-in循环确定顺序?
答案 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
尝试上述操作