Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Array[Symbol.species]

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2020 browserübergreifend verfügbar.

Die statische Accessor-Eigenschaft Array[Symbol.species] gibt den Konstruktor zurück, der verwendet wird, um die Rückgabewerte von Array-Methoden zu erzeugen.

Warnung: Die Existenz von [Symbol.species] ermöglicht die Ausführung beliebigen Codes und kann Sicherheitslücken verursachen. Sie erschwert außerdem bestimmte Optimierungen erheblich. Entwickler von JavaScript-Engines untersuchen, ob diese Funktion entfernt werden sollte. Vermeiden Sie nach Möglichkeit, sich darauf zu verlassen. Moderne Array-Methoden wie toReversed() verwenden [Symbol.species] nicht und geben immer eine neue Instanz der Basisklasse Array zurück.

Syntax

js
Array[Symbol.species]

Rückgabewert

Der Wert des Konstruktors (this), für den get [Symbol.species] aufgerufen wurde. Der Rückgabewert wird verwendet, um die Rückgabewerte von Array-Methoden zu erzeugen, die neue Arrays erstellen.

Beschreibung

Die Accessor-Eigenschaft [Symbol.species] gibt den Standardkonstruktor für Array-Objekte zurück. Konstruktoren von Unterklassen können sie überschreiben, um festzulegen, welcher Konstruktor verwendet wird. Die Standardimplementierung entspricht im Wesentlichen:

js
// Hypothetical underlying implementation for illustration
class Array {
  static get [Symbol.species]() {
    return this;
  }
}

Aufgrund dieser polymorphen Implementierung gibt [Symbol.species] auch für abgeleitete Unterklassen standardmäßig deren eigenen Konstruktor zurück.

js
class SubArray extends Array {}
SubArray[Symbol.species] === SubArray; // true

Beim Aufruf von Array-Methoden, die das bestehende Array nicht verändern, sondern eine neue Array-Instanz zurückgeben (beispielsweise filter() und map()), wird auf constructor[Symbol.species] des Arrays zugegriffen. Der zurückgegebene Konstruktor wird verwendet, um den Rückgabewert der Array-Methode zu erzeugen. Dadurch ist es technisch möglich, dass Array-Methoden Objekte zurückgeben, die keine Arrays sind.

js
class NotAnArray {
  constructor(length) {
    this.length = length;
  }
}

const arr = [0, 1, 2];
arr.constructor = { [Symbol.species]: NotAnArray };
arr.map((i) => i); // NotAnArray { '0': 0, '1': 1, '2': 2, length: 3 }
arr.filter((i) => i); // NotAnArray { '0': 1, '1': 2, length: 0 }
arr.concat([1, 2]); // NotAnArray { '0': 0, '1': 1, '2': 2, '3': 1, '4': 2, length: 5 }

Beispiele

Species bei gewöhnlichen Objekten

Die Eigenschaft [Symbol.species] gibt die Standard-Konstruktorfunktion zurück. Für Array ist dies der Array-Konstruktor.

js
Array[Symbol.species]; // [Function: Array]

Species bei abgeleiteten Objekten

Bei einer Instanz einer benutzerdefinierten Array-Unterklasse wie MyArray ist die Species von MyArray der Konstruktor MyArray. Sie können dies jedoch überschreiben, damit Methoden Ihrer abgeleiteten Klasse stattdessen Objekte der übergeordneten Klasse Array zurückgeben:

js
class MyArray extends Array {
  // Overwrite MyArray species to the parent Array constructor
  static get [Symbol.species]() {
    return Array;
  }
}

Spezifikationen

Spezifikation
ECMAScript® 2027 Language Specification
# sec-get-array-%symbol.species%

Browser-Kompatibilität

Siehe auch