Actionscript 2 & 3: Die Evolution von „for..in“?

Folgender Code soll das Problem veranschaulichen:

var oTest:Object = new Object ();
for (var sY:String = '', uX:Number = 0; uX < 10; uX ++) {
sY = String.fromCharCode (uX + 65);
oTest[sY] = uX;
trace (sY + " = " + uX);
}
trace ("-------- for in ----------->");
for (var sI:String in oTest) {
trace (sI + " = " + oTest[sI]);
}

Dieser Code in AS2 kompiliert führt zu folgendem Ergebnis:

A = 0
B = 1
C = 2
D = 3
E = 4
F = 5
G = 6
H = 7
I = 8
J = 9
——– for in ———–>
J = 9
I = 8
H = 7
G = 6
F = 5
E = 4
D = 3
C = 2
B = 1
A = 0

Das Erstellen von Eigenschaften fuer ein Objekt wird intern also in einem Stack geführt, wodurch die Reihenfolge erhalten bleibt (natürlich gedreht wie es bei einem Stack erwartbar ist).
Kompiliert man den selben Code in AS3, dann ist das Ergebnis:

A = 0
B = 1
C = 2
D = 3
E = 4
F = 5
G = 6
H = 7
I = 8
J = 9
——– for in ———–>
H = 7
C = 2
I = 8
D = 3
J = 9
E = 4
F = 5
A = 0
G = 6
B = 1

Welchem Schema folgt die Ausgabe der Methoden nun? Wohl keinem. Sicherlich ist dies kein großes Problem, wenn man denn weiß, daß es so ist. Und siehe da, es wird sogar in der Doku erwähnt:

Object properties are not kept in any particular order, so properties may appear in a seemingly random order.

Jemand eine Idee, warum das so sein muß? Denn nur durch das Stack-Verhalten bei der Zuweisung von Objekteigenschaften kann man die Reihenfolge bewahren. Nun muß man Arrays benutzen, die Objekte enthalten, welche wiederrum Eigenschaften haben, die abgefragt werden müssen. Um ein bestimmtes Objekt mit einer bestimmten Eigenschaft zu erhalten, ist also eine Suche über alles nötig, was bisher durch einen Direktverweis anhand des Eigenschaftsnamen möglich war. Warum muß das so sein? Wo PHP & Co das Durchlaufen von Objekteigenschaften auch in definierter Ordnung realisieren können …

Bug || Feature?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.