JavaScript - Arrays - Voodoo oder was?
1. Die Abschnitte
- Überblick
- Das dumme Objekt
- Die Sache mit den Indizes
- Das Ding mit der Verarbeitung
- Voodoo oder was?
- Sein oder nicht sein, das ist hier die Frage
- Und all die schönen Array-Funktionen von PHP?
- Die Erleuchtung
2. Himmel, Gesäß und Nähfaden
Nehmen wir mal an, wir haben irgendein Array. Nun wollen wir dessen Inhalte in eine Art temporäres Array übernehmen und dann die Werte ändern. Der mittlerweile bekannte und geübte PHP-Programmierer will es sich so einfach wie möglich machen und geht folgendermaßen vor:
mein_array = new Array ();
mein_array[0] = 'laber';
mein_array[1] = 'schwall';
mein_array[2] = 'sülz';
mein_array[3] = 'jodelblah';
tmp_array = mein_array;
Als nächstes möchte er sein "temporäres" Array um einen weiteren Eintrag ergänzen. Da er aber von den Tücken weiß, die JavaScript
so mit sich bringt, gibt er das Ergebnis per alert
aus.
tmp_array.push ('kräh');
alert (tmp_array);
Weil die Ausgabe stimmt, denkt sich der geübte PHP-Programmierer, alles feini feini, lehnt sich zufrieden zurück und macht nach
einer kurzen Pause weiter. Kurzer Hinweis: mit push
hängt man ein weiteres Element hinten an ein Array dran.
Als nächstes möchte er nun ein weiteres "temporäres" Array aus dem Original erstellen und Elemente daraus löschen. Kein Problem, folgender Code sollte dafür reichen:
tmp2_array = mein_array;
tmp2_array.pop();
Zur Info: pop
ist kein Schweinkram. Damit löscht man einfach nur den letzten Eintrag in einem Array. Aber auf ein Mal
ist nichts mehr feini feini! Wir bekommen beim alert
alle Werte des Arrays mein_array
zurückgeliefert!
Die böse Überraschung
Was in des Dreiteufelsnamen (dem Erfinder von JavaScript) ist denn nun passiert? Eigentlich sollten im zweiten "temporären" Array doch nur
drei Werte stehen, da ja der letzte mit pop
entfernt wurde. Wäre unser geübter PHP-Programmierer weiblichen Geschlechts und
wir befänden uns geistig noch im Mittelalter, so würden mit Sicherheit Rufe ertönen wie
Verbrennt sie, verbrennt sie. Hexerei! Magie! Sie hat mich meiner Manneskraft beraubt! [Quelle: Hysterische Männer mit einer geistigen Einstellung aus dem Mittelalter]
3. Logos 1, Aberglauben 0
Na ja, ob das so logisch ist, sei erst mal dahingestellt. Fakt ist aber dass in JavaScript bei solchen Anweisungen wie
tmp_array = mein_array;
nur eine Referenz auf das Original erzeugt wird! Alle Änderungen, von denen
der geübte PHP-Programmierer glaubt, dass sie im "temporären" Array geschehen, werden doch im Original vorgenommen.
Man muss sich das so vorstellen.
-
Das Array
mein_array
wird angelegt und mit Inhalten befüllt -
Dann wird eine Referenz auf dieses Array in der Variable
tmp_array
erzeugt (tmp_array = mein_array;
) -
Über diese Referenz (
tmp_array
) wird nun ein weiteres Element an das Originalmein_array
angehängt (tmp_array.push ('kräh');
) -
Danach wird eine zweite Referenz auf das Original erzeugt (
tmp2_array = mein_array;
) -
Und zum Schluss wird das Element, dass mit
tmp_array.push ('kräh');
hinzugefügt wurde, wieder entfernt (tmp2_array.pop();
)
Klingt logisch, man muss es nur wissen. Mich selber hat diese Unkenntnis zwei oder drei Stunden gekostet, eh ich darauf gekommen bin. Aber wie kann man denn nun ein echtes "temporäres" Array erzeugen? Zum Beispiel so.
tmp_array = new Array ();
// entweder
for (i in mein_array)
{
tmp_array[i] = mein_array[i];
}
// oder
for (i in mein_array)
{
tmp_array.push (mein_array[i]);
}
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt