SELF-Treffen in Mannheim 2025

SELFHTML wird 30 Jahre alt! → Veranstaltungs-Ankündigung.

JavaScript/Objekte/Array

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Mit dem eingebauten Konstruktor Array können Arrays erzeugt werden. Das Prototyp-Objekt von Array stellt den größten Teil der eingebauten Funktionalität für Arrays bereit. Der Konstruktor verfügt jedoch auch selbst über einige Methoden, mit denen zum Beispiel geprüft werden kann, ob es sich bei einem bestimmten Wert um ein Array handelt oder nicht.

Syntax

Array() erzeugt ein leeres Array
Array(länge) Erzeugt ein Array mit länge leeren Elementen
Array(...elemente) Erzeugt ein Array aus den übergebenen Elementen.

Erzeugung von Arrays

Der Array-Konstruktor hat die besondere Eigenschaft, dass er auch ohne das new-Schlüsselwort genutzt werden kann. In beiden Fällen wird ein neues Array-Objekt erzeugt. Ob und mit welchen Elementen das erzeugte Array initialisiert wird, hängt dabei von den übergebenen Argumenten ab.

Leeres Array

Wird beim Aufruf kein Argument übergeben, dann wird einfach ein leeres Array zurückgegeben.

Beispiel
const empty = new Array;

console.log(empty.length);    // Ausgabe: 0

Array wird durch den Operator new als Konstruktor aufgerufen. Wird new verwendet, ist die Angabe von Funktionsklammern hinter Array nicht erforderlich. Da keine Argumente übergeben wurden, wird ein leeres Array erzeugt und zurückgegeben, wie die Ausgabe des Wertes der Eigenschaft length zeigt.

Array mit vorgegebener Länge

Um ein leeres Array mit einer bestimmten Länge zu erzeugen, übergeben Sie die gewünschte Länge als Argument. Der Wert, den Sie übergeben, darf nicht negativ sein und auch keine Nachkommastellen haben, andernfalls löst JavaScript einen RangeError aus.

Beispiel
const array = Array(4);					// Aufruf diesmal ohne new
console.log(array.length);              // Ausgabe: 4
console.log(array[1]]);                 // Ausgabe: undefined

Die Einträge dieses leeren Arrays bleiben leer, es wird lediglich die length Eigenschaft gesetzt. Liest man einen dieser Einträge aus, erhält man undefined.

Array mit vorgegebenen Werten

Die dritte Aufrufmöglichkeit besteht darin, dem Konstruktor ein Liste von Werten zu übergeben. Daraus entsteht ein Array, das genau diese Werte enthält. Diese Syntax ist eine „Jugendsünde“ von JavaScript 1.3 aus dem Jahr 1998, als es noch keine Arrayliterale gab.

Deshalb hat in dem Fall, dass Sie nur einen Wert übergeben und es sich dabei um eine Zahl handelt, die Aufrufvariante „Array mit vorgegebener Länge“ Vorrang.

Beispiel
const list = Array(16, 32, 64);

console.log(list.length);    // Ausgabe: 3
console.log(list[2]);        // Ausgabe: 64
Empfehlung: Verwenden Sie diese Aufrufvariante nicht. Nutzen Sie statt dessen Arrayliterale, oder eine der mit ECMAScript 2015 hinzugefügten Methoden Array.from und Array.of. Diese Methoden haben Zusatzfunktionalität, die mit einem Arrayliteral nicht erzielt werden kann.

Leere Arrayeinträge

Zu beachten ist, dass ein leerer Arrayeintrag und ein Eintrag mit dem Wert undefined nicht das Gleiche sind. Leere Einträge belegen keinen Speicher, undefined-Einträge hingegen schon. Bei 100 Einträgen ist das irrelevant, bei 10000000 Einträgen sieht das anders aus.

Der Unterschied liegt darin, dass JavaScript-Arrays keine Arrays wie in anderen Sprachen sind, sondern Objekte, die eine gewisse Sonderbehandlung genießen. Wird einem Array an Indexposition 17 ein Wert zugewiesen, bekommt das Arrayobjekt eine Eigenschaft mit dem Namen "17". Greift man auf Indexposition 42 zu, ohne dass diese Position initialisiert wurde, so gibt es die Eigenschaft mit dem Namen "42" nicht und wie bei jedem Zugriff auf eine unbekannte Eigenschaft liefert JavaScript hierfür undefined.

Der Unterschied ist also: Ein leeres Array ist ein Objekt ohne Eigenschaften. Ein Array mit 1000 undefined-Einträgen ist ein Objekt mit 1000 Eigenschaften!

Beispiel
// *1
const array = Array(10000000);          // Vorsicht, 10 Millionen ist bereits grenzwertig!
array[3] = 47;
console.log(array.length);              // Ausgabe: 10000000
console.log(array);                     // Ausgabe: (10000000) [leer × 3, 47, leer × 996]
// *2
array.fill(undefined);                  // Dies dauert einige Zeit!
// *3
console.log(array);                     // Ausgabe: (10000000) [undefined,undefined,undefined...]

Wenn Sie die diese Befehle in der Konsole der Entwicklerwerkzeuge ausführen, und am Punkt *1 auf den belegten Heap-Speicher schauen (in Chrome-Browsern ist das der Arbeitsspeicher-Tab), dann werden Sie feststellen, dass sich diese Belegung am Punkt *2 kaum geändert, am Punkt *3 aber gewaltig vergrößert hat. Wenn sie 100 Millionen Einträge setzen, kann der fill-Aufruf Minuten dauern und der Browser mehrere Gigabyte Speicher belegen.

Verwendung

Array-Literale

Die Verwendung der Konstruktorfunktion ist im Allgemeinen nicht sinnvoll. Zur Erzeugung von Arrays eignen sich Array-Literale viel besser. Ein Array-Literal besteht aus einem Paar eckiger Klammern, zwischen denen die Elemente, aus denen das Array bestehen soll, durch Komma getrennt notiert werden.

Beispiel
const empty = [ ];

const list = ['alpha', 'omega'];

const numbers = [5.8];

Wie die letzte Variante in dem Beispiel oben zeigt, gibt es hierbei auch keine Probleme, wenn zunächst nur ein Element in dem Array hinterlegt werden soll und dieses Element keine positive Ganzzahl ist, was beim Aufruf des Konstruktors wie gesehen einen Range Error erzeugt hätte. Es ist also anzuraten, für die Erzeugung von Arrays prinzipiell die hier gezeigte Literalschreibweise zu verwenden, oder alternativ die Methoden Array.of oder Array.from.

Auslassungen

Mit Array-Literalen können Sie auch leere Arrayelemente erzeugen, indem Sie sogenannte Auslassungen verwenden (was nichts anderes heißt als: ein Komma, vor oder hinter dem nichts steht).

Beispiel
const array = [ , 1, , , 4, ];
console.log(array);      // Ausgabe: (5) [ leer, 1, leer × 2, 4 ]

Haben Sie nachgezählt? Wieso hat das Array nur 5 Elemente? Bei 5 Kommas sollten es doch 6 werden, hinter der 4 fehlt ein leer, oder? Rein formal müsste diese Auslassung ein leeres Arrayelement erzeugen, aber viele Leute haben beim Kopieren von Code ein solches Komma einfach vergessen zu löschen und hatten dann ein Arrayelement mehr als beabsichtigt. Um ihnen zu „helfen“, haben manche Browser das überzählige Komma ignoriert, aber nicht alle. Mit ECMAScript 5 wurde das Ignorierverhalten standardisiert. Wenn Sie tatsächlich durch Auslassen ein leeres Element am Array-Ende haben wollen, müssen Sie zwei Kommas machen.

Braucht man den Konstruktor überhaupt

Manchmal ja. Wenn Sie ein leeres Array mit einer bestimmten Länge erzeugen wollen, benötigen Sie ihn. Der Anwendungsfall "leeres Array mit vorgegebener Länge" ist allerdings nicht sehr häufig. Es ist Stress für die Speicherverwaltung von JavaScript, ein existierendes Array vergrößern zu müssen. Wenn Sie wissen, dass Sie eine große und annähernd bekannte Anzahl von Werten zu einem Array zusammentragen müssen, kann es effizienter sein, das Array vorab anzulegen, statt die Werte mit der push-Methode nacheinander anzuhängen.

Sodann können Sie von Array Subklassen ableiten (siehe Klassen und Vererbung) und hier dient die Konstruktorfunktion als Ankerpunkt für die Subklassen.

Weblinks