molily: Objects und Arrays

Beitrag lesen

Ja genau oh Wunder, es ist doch ein Array. Besser gesagt ein "assoziativer Array".

Da steht lediglich, dass alle Objekte in JavaScript das Verhalten zeigen, was in anderen Programmiersprachen »assoziativer Array« heißt. Wie Struppi sagt ist das aber kein Streit um eine Benennung, meinetwegen nenne Objekte so.

Diese Benennung ist allerdings im Bereich von JavaScript äußerst irreführend, denn Arrays in JavaScript über die Konstruktorfunktion »Array« sind etwas besonderes. Sie sind natürlich auch Objekte und die Array-Elemente sind ganz normale Eigenschaften des Objektes.

Das heißt, ich kann folgendes schreiben:

var myA = new Array();
myA[0] = "bla"
myA["1"] = "blub";
myA["Hallo Welt"] = "Hello World";
myA.bla = "sülz";

Ich habe dem Array als OBJEKT vier Eigenschaften (Member) angehängt.
Ich habe dem Array als ARRAY jedoch nur zwei Elemente hinzugefügt. Als Array-Elemente werden nur die numerischen 0 und 1 gezählt.

Wenn ich jetzt die <http://de.selfhtml.org/javascript/objekte/array.htm@title=Array-spezifischen vordefinierten Eigenschaften und Methoden> benutzen will, so geben diese auch nur diese beiden Elemente wieder:

alert(myA.length); // 2

Wenn ich jetzt NUR die Funktionalität eines »assoziativen Arrays« will und Name-Wert-Paare speichern will, so bringt mir die Benutzung des Array-Konstruktors überhaupt nichts:

displayList[1] = new Array();
displayList[1]["name"]= "referenz2";
displayList[1]["display"]= 0;

Hier bleibt die length immer auf 0, der Array ist leer - aber als Objekt hat er natürlich zwei Eigenschaften!

Array ist ein also spezifisches Objekt und hat alle Eigenschaften eines allgemeines Objektes. Der Konstruktor für allgemeine Objekte, von dem alle anderen JavaScript-Objekte abstammen, lautet »Object«. D.h. eine Array-Instanz ist immer auch eine Object-Instanz (Ist-ein-Beziehung).

Wie Struppi sagt, gibt es sehr viele spezifische Objekttypen, die von Object erben und sich daher als »assoziativer Array« gebrauchen ließen (selbst RegExp, Date, Function, Boolean usw.). Dabei werden ihnen aber bloß neue Eigenschaften angehängt, die spezifische Funktionalität bleibt ungenutzt und hat damit ggf. nichts zu tun.

Es ist daher unlogisch und irreführend, wenn man ein spezifisches Objekt nimmt, insbesondere Array. Das suggeriert, dass man den Array auch als Array nutzen kann - was aber nicht der Fall ist.

Zusammengefasst:

Object - Speichern von beliebigen ungeordneten Name-Wert-Paaren (Objekt-Eigenschaften). Durchlaufen über eine for-in-Schleife. Es gibt keine Sortierung und keine Möglichkeit, die Anzahl der Eigenschaften abzufragen (außer man durchläuft sie mit for-in und zählt mit).

var o = new Object();
o.name1 = "wert1";
o.name2 = "wert2";

oder in der Literalschreibweise:

var o = { name1 : "wert1", name2 : "wert2" };

Array - Speichern von geordneten Indexzahl-Wert-Paaren. Durchlaufen über normale for-Schleife (for-in ginge auch, aber nicht der Reihe nach). Es gibt Sortierung usw. und die Möglichkeit, die Anzahl der Elemente abzufragen.

var a = new Array();
a[0] = "wert1";
a[1] = "wert2";

oder

a.push("wert1");
a.push("wert2");

oder in der Literalschreibweise:

var a = ["wert1", "wert2"]

Mathias