RegExp[Symbol.species]

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die statische Zugriffs-Eigenschaft RegExp[Symbol.species] gibt den Konstruktor zurück, der verwendet wird, um kopierte reguläre Ausdrücke innerhalb bestimmter RegExp-Methoden zu erstellen.

Warnung: Die Existenz von [Symbol.species] ermöglicht die Ausführung von beliebigem Code und kann Sicherheitslücken schaffen. Sie erschwert auch bestimmte Optimierungen erheblich. Die Entwickler von JavaScript-Engines untersuchen, ob diese Funktion entfernt werden sollte. Vermeiden Sie es, sich nach Möglichkeit darauf zu verlassen.

Probieren Sie es aus

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

const regex1 = new MyRegExp("foo", "g");

console.log(regex1.test("football"));
// Expected output: true

Syntax

js
RegExp[Symbol.species]

Rückgabewert

Der Wert des Konstruktors (this), auf dem get [Symbol.species] aufgerufen wurde. Der Rückgabewert wird verwendet, um kopierte RegExp-Instanzen zu erstellen.

Beschreibung

Die [Symbol.species]-Zugriffs-Eigenschaft gibt den Standard-Konstruktor für RegExp-Objekte zurück. Konstruktoren von Unterklassen können diese überschreiben, um die Zuweisung des Konstruktors zu ändern. Die Standard-Implementierung ist im Wesentlichen:

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

Aufgrund dieser polymorphen Implementierung würde [Symbol.species] von abgeleiteten Unterklassen standardmäßig ebenfalls den Konstruktor selbst zurückgeben.

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

Einige RegExp-Methoden erstellen vor der Ausführung von exec() eine Kopie der aktuellen Regex-Instanz, damit Nebeneffekte wie Änderungen an lastIndex nicht beibehalten werden. Die [Symbol.species]-Eigenschaft wird verwendet, um den Konstruktor der neuen Instanz zu bestimmen. Die Methoden, die die aktuelle Regex-Instanz kopieren, sind:

Beispiele

Species in normalen Objekten

Die [Symbol.species]-Eigenschaft gibt die Standardkonstruktionsfunktion zurück, welche der RegExp-Konstruktor für RegExp-Objekte ist:

js
RegExp[Symbol.species]; // function RegExp()

Species in abgeleiteten Objekten

In einer Instanz einer benutzerdefinierten RegExp-Unterklasse, wie etwa MyRegExp, ist die MyRegExp-Species der MyRegExp-Konstruktor. Sie könnten jedoch möchten, dies zu überschreiben, um Eltern-RegExp-Objekte in den Methoden Ihrer abgeleiteten Klasse zurückzugeben:

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

Oder Sie können dies nutzen, um den Kopiervorgang zu beobachten:

js
class MyRegExp extends RegExp {
  constructor(...args) {
    console.log("Creating a new MyRegExp instance with args:", args);
    super(...args);
  }
  static get [Symbol.species]() {
    console.log("Copying MyRegExp");
    return this;
  }
  exec(value) {
    console.log("Executing with lastIndex:", this.lastIndex);
    return super.exec(value);
  }
}

Array.from("aabbccdd".matchAll(new MyRegExp("[ac]", "g")));
// Creating a new MyRegExp instance with args: [ '[ac]', 'g' ]
// Copying MyRegExp
// Creating a new MyRegExp instance with args: [ MyRegExp /[ac]/g, 'g' ]
// Executing with lastIndex: 0
// Executing with lastIndex: 1
// Executing with lastIndex: 2
// Executing with lastIndex: 5
// Executing with lastIndex: 6

Spezifikationen

Specification
ECMAScript® 2025 Language Specification
# sec-get-regexp-%symbol.species%

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch