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([length][...items])


Attribute
Writable true
Enumerable false
Configurable true


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 vorgegebenen Werten

Wie beschrieben, ist die Verwendung des new-Operators bei Array optional. Im folgenden Beispiel lassen wir ihn einfach mal weg und rufen Array als Funktion mit drei Argumenten auf:

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

console.log(list.length);    // Ausgabe: 3
console.log(list[2]);        // Ausgabe: 64

Wenn der Array-Konstruktor mit Argumenten aufgerufen wird, erzeugt er ein Array mit so vielen Einträgen, wie er Argumente bekommen hat, und kopiert diese Argumente hinein.

Beachten Sie: Wenn Sie Array mit nur einem Argument aufrufen, gibt es einen Sonderfall, der nur als Unfall im Design von JavaScript betrachtet werden kann und der im übernächsten Abschnitt behandelt wird. Um diesen Sonderfall zu vermeiden, verwenden Sie zum Erzeugen von Arrays mit vordefinierten Inhalten besser die weiter unten beschriebenen Arrayliterale oder die Methode Array.of.

Array mit vorgegebener Länge

Wird dem Array-Konstruktor genau ein Argument übergeben, und handelt es sich dabei um eine Zahl, verhält er sich abweichend: er erzeugt ein leeres Array mit einer Länge, die dem Argument entspricht. Ist das einzige Argument etwas anderes als eine Zahl, erzeugt er hingegen ein Array der Länge 1 mit dem Argument als Inhalt.

Zunächst wird aber geprüft, ob diese Zahl negativ ist oder ob sie Nachkommastellen besitzt. Wenn ja, bricht der Aufruf mit einem RangeError ab. Ist die Zahl 0 oder positiv, erzeugt er ein Array mit dieser Länge:

Beispiel
const array = Array(4);
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 <code>undefined</code>. 

=== Leere Arrayeinträge ===

Zu beachten ist, dass ein leerer Arrayeintrag und ein Eintrag mit dem Wert <code>undefined</code> nicht das Gleiche sind. Leere Einträge belegen keinen Speicher, <code>undefined</code>-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 <code>undefined</code>.

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

{{Beispiel|
{{BeispielCode}}
// *1
const array = Array(10000000);          // Vorsicht, 10 Millionen ist bereits grenzwertig!
array[3] = 47;
console.log(array.length);              // Ausgabe: 1000
console.log(array);                     // Ausgabe: (1000) [leer x 3, 47, leer x 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

Es ist grundsätzlich nicht empfehlenswert, Arrays unter Verwendung des Konstruktors Array zu erzeugen, da es für diesen Zweck mit den Array-Literalen eine deutlich elegantere Syntax gibt. 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 alternative die Methode Array.of.

Weblinks

Spezifikation

Array ECMAScript 2015 2017 Draft