Christian Seiler: Prototype: $A array each

Beitrag lesen

Hallo Schorsch,

Aha, vielen Dank für diese Infos.
Jetzt ist einiges klarer.

var arr = {ein:1,zwei:2,drei:3,vier:4}; // Objekt definieren
  alert(arr['ein']);                      // Funktioniert
  alert(arr.length);                      // Funktioniert nicht

Nicht ganz klar ist mir jedoch, warum arr.length nicht geht.
Ist das logisch?

Ja. Ich schreibe Deinen Code mal etwas um, so dass er noch exakt das gleiche macht, wie Deine erste Zeile:

var arr = new Object;  
arr['ein'] = 1; arr['zwei'] = 2; arr['drei'] = 3; arr['vier'] = 4;

Object enthält per Default keinerlei Eigenschaften oder Methoden, d.h. Du weist ihm exakt vier Eigenschaften ein, zwei, drei und vier zu.

Wenn Du einen Array anlegen willst, musst Du sowas wie

var arr1 = [ 1, 2, 3, 4 ];  
var arr2 = [];

machen. Allerdings nützt es Dir nichts, wenn Du dem Array dann weitere Eigenschaften zuweist, denn die sind _unabhängig_ von der length-Eigenschaft des Arrays, d.h.

var arr = [];  
arr['ein'] = 1;  
alert (arr.length);

spuckt Dir 0 aus, da Du eine Eigenschaft des Objekts (ein Array ist immer auch ein Objekt in JavaScript) gesetzt hast, den Speichermechanismus "Array" jedoch nicht genutzt hast. Wenn Du nämlich z.B. folgendes machst:

var arr = [];  
arr[4] = 'foo';  
alert (arr.length);

Dann spuckt Dir der Code 5 aus, denn Du hast das 5. Element des Arrays (Zählung geht bei 0 los) gesetzt; alle anderen Elemente davor, die zuvor nicht gesetzt waren, werden mit undefined aufgefüllt, d.h. ein

var arr = [];  
arr[10000000] = 'foo';

braucht *sehr* viel Speicher, obwohl Du nur ein Element hinzufügst. Wenn Du dagegen

var arr = {};  
arr[10000000] = 'foo';

machst, dann wird nur der Speicher für *eine* neue Eigenschaft mit dem Namen 10000000 benutzt, *allerdings* wird gibt's dann auch kein arr.length weil arr dann nur ein Objekt und *kein* Array ist - d.h. Du kannst auch nicht die typischen Array-Methoden auf arr anwenden.

Wie kann ich mein Objekt (ist es jetzt eigentlich ein Array oder nicht?)
durch eine Schlaufe jagen, so dass value und key ausgegeben werden?

Schau Dir mal das zweite Beispiel unter http://de.selfhtml.org/javascript/sprache/schleifen.htm#for an.

Viele Grüße,
Christian

--
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup