JavaScript/Objekte/Array
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.
Eigenschaften des Prototyps
Methoden des Prototyps
Inhaltsverzeichnis
Syntax
Array([length][...items])
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.
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:
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.
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:
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.
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
- MDN: Array
Spezifikation
Array | ECMAScript 2015 | 2017 Draft |