HOWTO · JavaScript

Enumerator in JavaScript

Im heutigen Beitrag werden wir mehr über Enumerator in JavaScript erfahren.

Auf dieser Seite

JavaScript hat keinen herkömmlichen eingebauten Typ Enum. In reinem JavaScript können Sie ein geordnetes Array verwenden, wenn die Position wichtig ist, oder ein Objekt erstellen, das Namen Zahlen zuordnet. Bei einer Suche im Array sucht indexOf(searchElement) nach einem passenden Wert. TypeScript bietet zwar eine Enum-Syntax, doch diese JavaScript-Muster verwenden gewöhnliche Arrays und Objekte, die sich anders verhalten.

Was ein Enum in JavaScript darstellt

Ein Enum versieht eine feste Gruppe zusammengehöriger Werte mit aussagekräftigen Namen. In JavaScript gelten für Arrays und Objekte nicht automatisch Enum-Regeln: Beide sind gewöhnliche, veränderbare Werte. Wählen Sie die Darstellung danach aus, wie Ihr Code auf die Werte zugreifen muss. Ein Array eignet sich, wenn die Reihenfolge wichtig ist oder Sie die Position eines Werts ermitteln möchten. Ein Objekt eignet sich, wenn Sie bereits einen Namen haben und die zugehörige Zahl benötigen.

Ein Array verwenden, wenn Sie geordnete Werte und eine Suche benötigen

Ein Array behält die Reihenfolge bei, in der seine Werte eingetragen wurden. Seine Methode indexOf gibt die Position des ersten passenden Werts zurück oder -1, wenn kein Treffer vorliegt. Der Vergleich erfolgt mit strikter Gleichheit; Werte unterschiedlichen Typs stimmen daher nicht überein. Kommt derselbe Wert mehrfach vor, wird das erste Vorkommen zurückgegeben.

Das optionale Argument fromIndex legt fest, an welcher Stelle die Suche beginnt. Bei einem nicht negativen Wert startet sie an dieser Position; ein negativer Wert zählt vom Ende des Arrays zurück. Liegt die so bestimmte Startposition hinter dem letzten Element, wird nichts gefunden. Liegt ein negativer Startwert vor dem Anfang des Arrays, beginnt die Suche beim ersten Element. Ausführliche Informationen finden Sie in der Referenz zu indexOf.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

const operatingSystems = ['Linux', 'macOS', 'Windows', 'Ubuntu'];
console.log(operatingSystems.indexOf('Linux'));

Die zurückgegebene Zahl ist die nullbasierte Position des ersten passenden Werts. Prüfen Sie bei einer Suche zuerst, ob das Ergebnis -1 ist, bevor Sie es als gültige Position verwenden. Ein Array ist außerdem veränderbar: Mit .push() lässt sich ein Wert anhängen, während .map() aus umgewandelten Werten ein neues Array erstellt. Für diese beiden Links enthält das Paket keine deutschen Ziele; sie verweisen daher weiterhin auf die vorhandenen englischen Seiten. Diese Methoden machen das Array weder zu einem Enum noch beschränken sie es auf eine feste Wertemenge.

Mit einer Schleife ein Enum-ähnliches Objekt erstellen

Wenn Aufrufer eine Zahl anhand eines Namens nachschlagen müssen, kann eine Schleife ein Objekt erstellen, dessen Eigenschaftsnamen aus einer Argumentliste stammen und dessen Werte den jeweiligen Positionen entsprechen. Diese Funktion verwendet arguments, die lokale Sammlung der Argumente, die einer herkömmlichen Funktion übergeben werden. Enum ist hier ein selbst gewählter Funktionsname und weder ein JavaScript-Schlüsselwort noch ein eingebauter Typ.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

function Enum() {
  const values = {};
  for (let i = 0; i < arguments.length; i++) {
    values[arguments[i]] = i;
  }
  return values;
}

const operatingSystem = Enum('Linux', 'macOS', 'Windows', 'Ubuntu');
console.log(operatingSystem.Linux);

Die Eigenschaft Linux ist dem Wert 0 zugeordnet, weil sie dem ersten Argument entspricht. Diese Variante gibt ein einfaches Objekt zurück, das sich direkt und ohne new verwenden lässt. Wird ein Argumentname wiederholt, überschreibt eine spätere Zuweisung den vorherigen Eigenschaftswert. Da dieses Objekt von Object.prototype erbt, eignet sich das einfache Muster am besten für eine kontrollierte Liste gewöhnlicher Namen. Können Namen aus nicht vertrauenswürdigen oder beliebigen Eingaben stammen, verwenden Sie stattdessen ein Objekt ohne Prototyp oder eine Map. Die Zuordnung funktioniert nur in eine Richtung: Sie ergänzt weder eine Rückwärtssuche von einer Zahl zu ihrem Namen noch prüft sie Werte, die an anderer Stelle im Programm zugewiesen werden.

Ein Muster wählen und seine Grenzen kennen

Verwenden Sie ein Array, wenn die Reihenfolge wichtig ist oder Sie Werte mit indexOf suchen müssen. Verwenden Sie ein Objekt, das Namen Zahlen zuordnet, wenn Ihre Eingabe ein bekannter Name ist und ein direkter Eigenschaftszugriff klarer ist als die Suche in einem Array. In beiden Fällen sorgt JavaScript weder dafür, dass die Sammlung unverändert bleibt, noch schließt es unbekannte Werte aus. Auch ist nicht garantiert, dass numerische Positionen stabil bleiben, wenn Sie die Einträge umsortieren.

Bei einer kleinen, festen Wertemenge können Sie alle Werte zusammenhalten und sie nach der Initialisierung gemäß Konvention nicht mehr ändern. Hängt Ihr Code von gespeicherten Zahlenwerten, Netzwerkformaten oder programmübergreifend verwendeten Werten ab, weisen Sie explizite Zahlen zu und behandeln Sie sie als Teil dieser Schnittstelle. Werden Zahlen aus Array-Positionen abgeleitet, kann eine Umordnung ihre Bedeutung unbemerkt ändern. Enums in TypeScript bieten eine Enum-Syntax zur Compile-Zeit, sind aber eine Funktion von TypeScript und haben ihr eigenes Verhalten im erzeugten JavaScript. Verwenden Sie sie, wenn das Typsystem von TypeScript Teil Ihres Projekts ist, statt davon auszugehen, dass native JavaScript-Arrays oder -Objekte dieselben Prüfungen bieten.