Was ist die bevorzugte Syntax zum Definieren von Aufzählungen in JavaScript? Etwas wie:
my.namespace.ColorEnum = {
RED : 0,
GREEN : 1,
BLUE : 2
}
// later on
if(currentColor == my.namespace.ColorEnum.RED) {
// whatever
}
Oder gibt es eine vorzuziehende Sprache?
javascript
syntax
enums
David Citron
quelle
quelle
0
als Aufzählungsnummer verwenden. Es sei denn, es wird für etwas verwendet, das nicht eingestellt wurde. JS behandeltfalse || undefined || null || 0 || "" || '' || NaN
alle im Vergleich mit==
.0 == null
gibt false zurückfalse == 0
und+null == 0
(und Umrechnungen in Zahlen passieren manchmal, wenn Sie es nicht erwarten), währendnull == undefined
, und+undefined
istNaN
(obwohlNaN != NaN
).Antworten:
Seit 1.8.5 ist es möglich, das Objekt zu versiegeln und einzufrieren. Definieren Sie Folgendes wie folgt:
oder
und voila! JS-Aufzählungen.
Dies hindert Sie jedoch nicht daran, einer Variablen einen unerwünschten Wert zuzuweisen, was häufig das Hauptziel von Aufzählungen ist:
Eine Möglichkeit, ein höheres Maß an Typensicherheit (mit Aufzählungen oder auf andere Weise) zu gewährleisten, ist die Verwendung eines Tools wie TypeScript oder Flow .
Quelle
Zitate werden nicht benötigt, aber ich habe sie aus Gründen der Konsistenz aufbewahrt.
quelle
var DaysEnum = Object.freeze ({ monday: {}, tuesday: {}, ... });
. Sie müssen keine ID angeben, sondern können nur ein leeres Objekt zum Vergleichen von Aufzählungen verwenden.if (incommingEnum === DaysEnum.monday) //incommingEnum is monday
if (Object.freeze) { Object.freeze(DaysEnum); }
({ monday: {},
usw. bedeutet, dass Sie erhalten, wenn Sie dieses Objekt über stringify in JSON konvertieren,[{"day": {}}]
was nicht funktioniert.var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}
. Das Vergleichen von Objekten wie in meinem vorherigen Kommentar ist VIEL langsamer als das Vergleichen von Zahlen.Dies ist keine gute Antwort, aber ich würde sagen, dass das persönlich gut funktioniert
Da es jedoch keine Rolle spielt, welche Werte verwendet werden (Sie haben 0, 1, 2 verwendet), würde ich eine aussagekräftige Zeichenfolge verwenden, falls Sie jemals den aktuellen Wert ausgeben möchten.
quelle
Object.freeze()
. Dadurch wird verhindert, dass anderer Code die Werte der Aufzählung ändert. Beispiel:var ColorEnum = Object.freeze({RED: 0, GREEN: 1, BLUE: 2});
instanceof
Überprüfungen durchführen können. Zum BeispielColorEnum.RED instanceof ColorEnum
(kehrt zurücktrue
). Sie können eine Instanz auch aus einem Namen heraus auflösenColorEnum.fromName("RED") === ColorEnum.RED
(Rückgabetrue
). Jede Instanz hat auch eine.name()
und eine.ordinal()
Methode, und die Aufzählung selbst hat einevalues()
Methode, die ein Array aller Konstanten zurückgibt.ToString()
Methode. Wir JS-Entwickler sind schon viel zu sehr auf Dinge angewiesen, die "nur funktionieren"! Auch sollte man in der Lage sein, schnellswitch
auf eine Aufzählung zuzugreifen. Das Vergleichen von Zeichenfolgen ist langsamer als das Vergleichenswitch
von Zahlen. Wenn Sie also Zeichenfolgen anstelle von Ganzzahlen verwenden , erhalten Sie eine etwas schlechtere Leistung.AKTUALISIEREN
Vielen Dank für all die positiven Stimmen, aber ich denke nicht, dass meine Antwort unten der beste Weg ist, Enums in JavaScript zu schreiben. Weitere Informationen finden Sie in meinem Blogbeitrag: Aufzählungen in JavaScript .
Das Benachrichtigen des Namens ist bereits möglich:
Alternativ können Sie die Werteobjekte erstellen, damit Sie den Kuchen auch essen können:
In JavaScript ist es als dynamische Sprache sogar möglich, dem Satz später Aufzählungswerte hinzuzufügen:
Denken Sie daran, dass die Felder der Aufzählung (Wert, Name und Code in diesem Beispiel) für die Identitätsprüfung nicht benötigt werden und nur zur Vereinfachung dienen. Auch der Name der size-Eigenschaft selbst muss nicht fest codiert sein, sondern kann auch dynamisch festgelegt werden. Angenommen, Sie kennen nur den Namen für Ihren neuen Aufzählungswert, können Sie ihn dennoch problemlos hinzufügen:
Dies bedeutet natürlich, dass einige Annahmen nicht mehr getroffen werden können (dieser Wert repräsentiert beispielsweise die richtige Reihenfolge für die Größe).
Denken Sie daran, dass ein Objekt in JavaScript wie eine Karte oder eine Hash-Tabelle ist . Eine Reihe von Name-Wert-Paaren. Sie können sie durchlaufen oder auf andere Weise manipulieren, ohne vorher viel über sie zu wissen.
Beispiel
Übrigens, wenn Sie an Namespaces interessiert sind, möchten Sie vielleicht einen Blick auf meine Lösung für einfaches, aber leistungsstarkes Namespace- und Abhängigkeitsmanagement für JavaScript werfen: Packages JS
quelle
Fazit: Das geht nicht.
Sie können es fälschen, aber Sie erhalten keine Typensicherheit. In der Regel wird dazu ein einfaches Wörterbuch mit Zeichenfolgenwerten erstellt, die ganzzahligen Werten zugeordnet sind. Zum Beispiel:
Das Problem mit diesem Ansatz? Sie können Ihren Enumeranten versehentlich neu definieren oder versehentlich doppelte Enumerantenwerte haben. Zum Beispiel:
Bearbeiten
Absolut,
Object.freeze
Würde das Problem, über das ich mich beschwert habe absolut beheben. Ich möchte alle daran erinnern, dass es das, als ich das oben Genannte schrieb,Object.freeze
nicht wirklich gab.Jetzt ... jetzt öffnet es einige sehr interessante Möglichkeiten.
Bearbeiten 2
Hier ist eine sehr gute Bibliothek zum Erstellen von Aufzählungen.
http://www.2ality.com/2011/10/enums.html
Während es wahrscheinlich nicht zu jeder gültigen Verwendung von Aufzählungen passt, geht es einen sehr langen Weg.
quelle
var daysEnum = (function(){ var daysEnum = { monday: 1, tuesday: 2 }; return { get: function(value){ return daysEnum[value]; } } })(); daysEnum.get('monday'); // 1
Folgendes wollen wir alle:
Jetzt können Sie Ihre Aufzählungen erstellen:
Auf diese Weise können Konstanten wie gewohnt aufgerufen werden (YesNo.YES, Color.GREEN) und sie erhalten einen sequentiellen int-Wert (NO = 0, YES = 1; RED = 0, GREEN = 1, BLUE = 2).
Sie können auch Methoden hinzufügen, indem Sie Enum.prototype verwenden:
Bearbeiten - kleine Verbesserung - jetzt mit varargs: (leider funktioniert es nicht richtig auf IE: S ... sollte dann bei der vorherigen Version bleiben)
quelle
In den meisten modernen Browsern gibt es einen primitiven Symboldatentyp , mit dem eine Aufzählung erstellt werden kann. Dies gewährleistet die Typensicherheit der Aufzählung, da jeder Symbolwert durch JavaScript als eindeutig garantiert wird, d
Symbol() != Symbol()
. H. Zum Beispiel:Um das Debuggen zu vereinfachen, können Sie den Aufzählungswerten eine Beschreibung hinzufügen:
Plunker-Demo
Auf GitHub finden Sie einen Wrapper, der den Code vereinfacht, der zum Initialisieren der Enumeration erforderlich ist:
quelle
Symbol
es vorgesehen ist.Object.freeze
nur für Leute, die nicht akzeptiert haben, dass "Monkeypatch auf eigenes Risiko" der Gesellschaftsvertrag von JS ist?toJSON
Am Ende habe ich eine explizite Beschreibung𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Kommen wir gleich zum Problem: Dateigröße. Jede andere hier aufgeführte Antwort bringt Ihren Code auf das Äußerste. Ich präsentiere Ihnen, dass dies für die bestmögliche Leistung, Lesbarkeit des Codes, umfangreiches Projektmanagement, Syntaxhinweise in vielen Code-Editoren und Reduzierung der Codegröße durch Minimierung die richtige Methode ist, um Aufzählungen durchzuführen: Unterstrich-Notationsvariablen.
wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvww
Wie in der obigen Tabelle und im folgenden Beispiel gezeigt, sind hier fünf einfache Schritte, um loszulegen:
ENUM_
. Wenn unabhängig oder nebeneinander, verwenden SieINDEX_
.ENUM_
oder beginntINDEX_
, dann den Namen der Gruppe, dann einen Unterstrich und dann einen eindeutigen Anzeigenamen für die EigenschaftENUMLENGTH_
,ENUMLEN_
,INDEXLENGTH_
, oderINDEXLEN_
(obLEN_
oderLENGTH_
persönliche Vorliebe) aufgezählt Variable am Ende. Sie sollten diese Variable nach Möglichkeit in Ihrem Code verwenden, um sicherzustellen, dass das Hinzufügen eines zusätzlichen Eintrags zur Aufzählung und das Erhöhen dieses Werts Ihren Code nicht beschädigt.0
sollen nicht als Aufzählungswert verwendet werden , da0 == null
,0 == false
,0 == ""
und andere JS Verrücktheit. Ich sage Ihnen, um dieses Problem zu vermeiden und gleichzeitig die Leistung zu steigern, verwenden Sie immer===
und lassen==
Sie es nie in Ihrem Code erscheinen, außer mittypeof
(extypeof X == "string"
). In all meinen Jahren===
hatte ich noch nie ein Problem damit, 0 als Aufzählungswert zu verwenden. Wenn Sie immer noch zimperlich sind,1
kann dies in vielen Fällen als Startwert inENUM_
Aufzählungen (aber nicht inINDEX_
Aufzählungen) ohne Leistungseinbußen verwendet werden.So erinnere ich mich, wann
INDEX_
und wann ich es verwenden sollENUM_
:Jedoch
ENUM_
kann unter bestimmten Umständen angemessen sein , als Index, wie wenn die Vorkommen der einzelnen Elemente zu zählen.Beachten Sie, dass es im obigen Code wirklich einfach ist, eine neue Art von Haustier hinzuzufügen: Sie müssten lediglich einen neuen Eintrag anhängen
ENUM_PET_RAT
und entsprechend aktualisierenENUMLEN_PET
. Es könnte schwieriger und fehlerhafter sein, einen neuen Eintrag in andere Aufzählungssysteme einzufügen.wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwv wvwv
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Darüber hinaus ermöglicht diese Syntax von Aufzählungen eine klare und präzise Klassenerweiterung, wie unten dargestellt. Um eine Klasse zu erweitern, fügen Sie dem
LEN_
Eintrag der übergeordneten Klasse eine inkrementelle Nummer hinzu . Beenden Sie dann die Unterklasse mit einem eigenenLEN_
Eintrag, damit die Unterklasse in Zukunft weiter erweitert werden kann.(Länge: 2.450 Byte)
Einige mögen sagen, dass dies weniger praktisch ist als andere Lösungen: Es beansprucht jede Menge Platz, das Schreiben dauert lange und es ist nicht mit Zuckersyntax beschichtet. Diese Leute hätten Recht, wenn sie ihren Code nicht minimieren würden. Keine vernünftige Person würde jedoch unminimierten Code im Endprodukt belassen. Für diese Minimierung ist Closure Compiler der beste, den ich bisher gefunden habe. Den Online-Zugang finden Sie hier . Der Closure-Compiler ist in der Lage, all diese Aufzählungsdaten zu erfassen und inline zu machen, sodass Ihr Javascript sehr klein ist und sehr schnell läuft. Minimieren Sie daher mit Closure Compiler. Beobachten.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwv wvwv
𝗠𝗶𝗻𝗶𝗳𝘆 𝗪𝗶𝘁𝗵 𝗖𝗹𝗼𝘀𝘂𝗿𝗲 𝗖𝗼𝗺𝗽𝗶𝗹𝗲𝗿
Der Closure-Compiler kann einige ziemlich unglaubliche Optimierungen über Schlussfolgerungen durchführen, die weit über die Kapazitäten anderer Javascript-Minifier hinausgehen. Closure Compiler kann primitive Variablen inline setzen, die auf einen festen Wert festgelegt sind. Closure Compiler kann auch basierend auf diesen Inline-Werten Rückschlüsse ziehen und nicht verwendete Blöcke in if-Anweisungen und Schleifen entfernen.
(Länge: 605 Bytes)
Closure Compiler belohnt Sie dafür, dass Sie intelligenter codieren und Ihren Code gut organisieren, denn während viele Minifahrer organisierten Code mit einer größeren minimierten Dateigröße bestrafen, kann Closure Compiler all Ihre Sauberkeit und Vernunft durchgehen, um eine noch kleinere Dateigröße auszugeben, wenn Sie Tricks anwenden wie Aufzählungen von Variablennamen. Dies ist in diesem Sinne der heilige Gral des Codierens: Ein Tool, das sowohl Ihren Code mit einer kleineren minimierten Größe unterstützt als auch Ihren Geist unterstützt, indem es bessere Programmiergewohnheiten trainiert.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwv wvwv
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Lassen Sie uns nun sehen, wie groß die entsprechende Datei ohne eine dieser Aufzählungen wäre.
Quelle ohne Verwendung von Aufzählungen (Länge: 1.973 Byte (477 Byte kürzer als aufgezählter Code!))
Minimiert ohne Verwendung von Aufzählungen (Länge: 843 Byte (238 Byte länger als aufgezählter Code ))
Wie zu sehen ist, ist der Quellcode ohne Aufzählungen auf Kosten eines größeren minimierten Codes kürzer. Ich kenn dich nicht wirklich; Ich weiß jedoch mit Sicherheit, dass ich keinen Quellcode in das Endprodukt einbinde. Daher ist diese Form der Aufzählung insofern weit überlegen, als sie zu kleineren minimierten Dateigrößen führt.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwv wvwv
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Ein weiterer Vorteil dieser Form der Aufzählung besteht darin, dass damit große Projekte einfach verwaltet werden können, ohne die minimierte Codegröße zu beeinträchtigen. Wenn Sie an einem großen Projekt mit vielen anderen Personen arbeiten, kann es hilfreich sein, die Variablennamen explizit zu markieren und zu kennzeichnen, mit denen der Code erstellt wurde, damit der ursprüngliche Ersteller des Codes für die gemeinsame Fehlerbehebung schnell identifiziert werden kann.
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Ferner ist diese Form der Aufzählung auch nach der Minimierung viel schneller. In normal benannten Eigenschaften muss der Browser Hashmaps verwenden, um nachzuschlagen, wo sich die Eigenschaft auf dem Objekt befindet. Obwohl JIT-Compiler diesen Speicherort auf dem Objekt intelligent zwischenspeichern, entsteht aufgrund von Sonderfällen wie dem Löschen einer niedrigeren Eigenschaft aus dem Objekt immer noch ein enormer Overhead.
Bei kontinuierlichen, nicht spärlichen, ganzzahlig indizierten PACKED_ELEMENTS- Arrays kann der Browser jedoch einen Großteil dieses Overheads überspringen, da der Index des Werts im internen Array bereits angegeben ist. Ja, gemäß dem ECMAScript-Standard sollen alle Eigenschaften als Zeichenfolgen behandelt werden. Trotzdem ist dieser Aspekt des ECMAScript-Standards in Bezug auf die Leistung sehr irreführend, da alle Browser spezielle Optimierungen für numerische Indizes in Arrays haben.
Vergleichen Sie den obigen Code mit dem folgenden Code.
Man könnte gegen den Code Einwände erheben, deren Aufzählungen viel länger zu sein scheinen als der Code mit gewöhnlichen Objekten, aber das Aussehen kann täuschen. Es ist wichtig zu beachten, dass die Quellcodegröße bei Verwendung des epischen Closure Compilers nicht proportional zur Ausgabegröße ist. Beobachten.
Der minimierte Code ohne Aufzählungen ist oben und der minimierte Code mit Aufzählungen ist unten.
Das obige Beispiel zeigt, dass der aufgezählte Code nicht nur eine überlegene Leistung aufweist, sondern auch zu einer kleineren minimierten Dateigröße führt.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwv wvwv
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Darüber hinaus verwendet diese persönliche Kirsche oben diese Form der Aufzählung zusammen mit dem CodeMirror- Texteditor im Javascript-Modus. Der Hervorhebungsmodus für die Javascript-Syntax von CodeMirror hebt lokale Variablen im aktuellen Bereich hervor. Auf diese Weise wissen Sie sofort, wann Sie einen Variablennamen korrekt , da der Variablenname zuvor mit der deklariert wurde,
var
Schlüsselwort deklariert wurde, erhält der Variablenname eine Sonderfarbe (standardmäßig Cyan). Auch wenn Sie CodeMirror nicht verwenden, ist zumindest der Browser hilfreich[variable name] is not defined
Ausnahme beim Ausführen von Code mit falsch eingegebenen Aufzählungsnamen. JavaScript-Tools wie JSLint und Closure Compiler sagen Ihnen sehr laut, wenn Sie einen Namen für eine Aufzählungsvariable falsch eingeben. CodeMirror, der Browser und verschiedene Javascript-Tools zusammen machen das Debuggen dieser Form der Aufzählung sehr einfach und sehr einfach.Im obigen Snippet wurden Sie mit einem Fehler benachrichtigt, da dieser
ENUM_COLORENUM_DNE
nicht vorhanden ist.wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwv wvwv
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Ich denke, man kann mit Sicherheit sagen, dass diese Aufzählungsmethode in der Tat der beste Weg ist, nicht nur für eine minimierte Codegröße, sondern auch für Leistung, Debugging und Zusammenarbeit.
Nachdem ich eine hilfreiche Frage gelesen habe, danke ich dem Autor, dass er Zeit in das Schreiben gesteckt hat, indem er auf den Pfeil oben links im Fragenfeld geklickt hat. Jedes Antwortfeld hat auch einen dieser Aufwärtspfeile.
quelle
colors.REED
Renditenundefined
), daher führen Tippfehler zu schwer fassbaren Rätseln. YEA unterscheidet nicht zwischen der Verwendung von Aufzählungen als Indizes und IDs, was zu verwirrendem Code führt, bei dem alles gleich aussieht. …Ich habe damit herumgespielt, weil ich meine Aufzählungen liebe. =)
Mit
Object.defineProperty
Ich denke, ich habe eine etwas praktikable Lösung gefunden.Hier ist eine jsfiddle: http://jsfiddle.net/ZV4A6/
Mit dieser Methode sollten Sie (theoretisch) in der Lage sein, Aufzählungswerte für jedes Objekt aufzurufen und zu definieren, ohne andere Attribute dieses Objekts zu beeinflussen.
Wegen des Attributs
writable:false
dies sollte es sicher geben machen.Sie sollten also in der Lage sein, ein benutzerdefiniertes Objekt zu erstellen und es dann aufzurufen
Enum()
. Die zugewiesenen Werte beginnen bei 0 und erhöhen sich pro Element.quelle
return this;
am Ende von Enum hinzufügen, können Sie Folgendes tun:var EnumColors = {}.Enum('RED','BLUE','GREEN','YELLOW');
false
ist die Standardeinstellung fürwritable
,enumerable
undconfigurable
. Keine Notwendigkeit, über Standardeinstellungen zu kauen.Verwenden Sie Javascript- Proxies
TLDR: Fügen Sie diese Klasse zu Ihren Dienstprogrammmethoden hinzu und verwenden Sie sie im gesamten Code. Sie verspottet das Enum-Verhalten traditioneller Programmiersprachen und löst tatsächlich Fehler aus, wenn Sie versuchen, entweder auf einen nicht vorhandenen Enumerator zuzugreifen oder einen Enumerator hinzuzufügen / zu aktualisieren. Sie müssen sich nicht darauf verlassen
Object.freeze()
.Erstellen Sie dann Aufzählungen, indem Sie die Klasse instanziieren:
Vollständige Erklärung:
Eine sehr nützliche Funktion von Enums, die Sie aus traditionellen Sprachen erhalten, ist, dass sie explodieren (einen Fehler beim Kompilieren auslösen), wenn Sie versuchen, auf einen Enumerator zuzugreifen, der nicht vorhanden ist.
Abgesehen davon, dass die verspottete Enum-Struktur eingefroren wird, um zu verhindern, dass versehentlich / böswillig zusätzliche Werte hinzugefügt werden, befasst sich keine der anderen Antworten mit dieser intrinsischen Funktion von Enums.
Wie Sie wahrscheinlich wissen, wird der Zugriff auf nicht vorhandene Mitglieder in JavaScript einfach zurückgegeben
undefined
und Ihr Code wird nicht in die Luft gesprengt. Da Enumeratoren vordefinierte Konstanten sind (dh Wochentage), sollte es niemals einen Fall geben, in dem ein Enumerator undefiniert sein sollte.Verstehen Sie mich nicht falsch, das Rückgabeverhalten von JavaScript
undefined
beim Zugriff auf undefinierte Eigenschaften ist tatsächlich ein sehr leistungsfähiges Merkmal der Sprache, aber es ist kein Merkmal, das Sie möchten, wenn Sie versuchen, traditionelle Enum-Strukturen zu verspotten.Hier leuchten Proxy-Objekte. Mit der Einführung von ES6 (ES2015) wurden die Proxies in der Sprache standardisiert. Hier ist die Beschreibung von MDN:
Ähnlich wie bei einem Webserver-Proxy können JavaScript-Proxys Operationen an Objekten abfangen (unter Verwendung von "Traps", nennen Sie sie Hooks, wenn Sie möchten) und verschiedene Überprüfungen, Aktionen und / oder Manipulationen durchführen, bevor sie abgeschlossen sind (oder In einigen Fällen werden die Operationen insgesamt gestoppt. Dies ist genau das, was wir tun möchten, wenn wir versuchen, auf einen nicht vorhandenen Enumerator zu verweisen.
Hier ist ein erfundenes Beispiel, das das Proxy-Objekt verwendet, um Aufzählungen nachzuahmen. Die Enumeratoren in diesem Beispiel sind Standard-HTTP-Methoden (dh "GET", "POST" usw.):
ASIDE: Was zum Teufel ist ein Proxy?
Ich erinnere mich, als ich das Wort Proxy zum ersten Mal überall sah, machte es für mich lange Zeit definitiv keinen Sinn. Wenn Sie es gerade sind, besteht eine einfache Möglichkeit, Proxys zu verallgemeinern, darin, sie als Software, Institutionen oder sogar als Personen zu betrachten, die als Vermittler oder Zwischenhändler zwischen zwei Servern, Unternehmen oder Personen fungieren.
quelle
valueOf
indem Sie sie als Instanzmethode in der Enum-Klasse angeben. Warum möchten Sie jedoch auf diese Weise darauf zugreifen, anstatt nur über die Punktnotation darauf zuzugreifen?logLevelEnum[settings.get("log_level")]
? Das HinzufügenparseOrThrow
würde sich nur wiederholen, was die Proxy-Traps bereits für Sie tun.Dies ist eine alte, die ich kenne, aber die Art und Weise, wie sie seitdem über die TypeScript-Oberfläche implementiert wurde, ist:
Auf diese Weise können Sie unabhängig von der Reihenfolge der Deklaration nachsehen,
MyEnum.Bar
welche 1 undMyEnum[1]
welche "Bar" zurückgibt.quelle
enum MyEnum { Foo, Bar, Foobar }
In ES7 können Sie eine elegante ENUM erstellen , die auf statischen Attributen basiert :
dann
Der Vorteil (Verwendung einer Klasse anstelle eines
Enum
Literalobjekts ) besteht darin, dass eine übergeordnete Klasse vorhanden ist. Alle Ihre Enums erweitern diese Klasse.quelle
new ColorEnum()
macht absolut keinen Sinn.Enum
Standard hat statische enumerator Methoden auf sich, wiegetValues()
,getNames()
,iterate()
usw. Wenn das der Fall ist, müssen Sie sie nicht für jede neue Art von neu zu implementierenenum
.Dies ist die Lösung, die ich benutze.
Und Sie definieren Ihre Aufzählungen wie folgt:
Und so greifen Sie auf Ihre Aufzählungen zu:
Normalerweise verwende ich die letzten beiden Methoden, um Aufzählungen von Nachrichtenobjekten zuzuordnen.
Einige Vorteile dieses Ansatzes:
Einige Nachteile:
quelle
Erstellen Sie ein Objektliteral:
quelle
const
macht die Eigenschaften des Objekts nicht unveränderlich, sondern bedeutet nur, dass die VariableModes
nicht etwas anderem zugewiesen werden kann. Um es vollständiger zu machen, verwenden SieObject.freeze()
nebenconst
.Object.freeze
. Es verhindert, dass der Closure Compiler das Objekt einbindet.Wenn Sie mit Backbone , können Sie ausgewachsene ENUM - Funktionalität (finden von id, name, benutzerdefinierte Mitglieder) kostenlos mit bekommen Backbone.Collection .
quelle
Ihre Antworten sind viel zu kompliziert
quelle
Ich habe die Lösung von Andre 'Fi' geändert:
Prüfung:
quelle
Ich habe mir diesen Ansatz ausgedacht, der Enums in Java nachempfunden ist. Diese sind typsicher, sodass Sie auch
instanceof
Überprüfungen durchführen können .Sie können Aufzählungen wie folgt definieren:
Days
bezieht sich jetzt auf dieDays
Aufzählung:Die Umsetzung:
quelle
freeze
Methode auf Abwärtskompatibilität prüfen ? ZBif (Object.freeze) { Object.freeze(values); }
IE8 unterstützt die Methode freeze () nicht.
Quelle: http://kangax.github.io/compat-table/es5/ , Klicken Sie auf "Veraltete Browser anzeigen?" oben und überprüfen Sie IE8 und frieren Sie die Kreuzungskreuzung ein.
In meinem aktuellen Spielprojekt habe ich unten verwendet, da nur noch wenige Kunden IE8 verwenden:
Wir könnten auch tun:
oder sogar das:
Die letzte Option scheint für Zeichenfolgen am effizientesten zu sein. Sie reduziert Ihre Gesamtbandbreite, wenn Server und Client diese Daten austauschen.
Natürlich ist es jetzt Ihre Pflicht, sicherzustellen, dass die Daten keine Konflikte enthalten (RE, EX usw. müssen eindeutig sein, auch 1, 2 usw. sollten eindeutig sein). Beachten Sie, dass Sie diese aus Gründen der Abwärtskompatibilität für immer beibehalten müssen.
Zuordnung:
Vergleich:
quelle
Sie müssen nicht sicherstellen, dass Sie auf diese Weise keinen doppelten Zahlen unterschiedliche Aufzählungswerte zuweisen. Ein neues Objekt wird instanziiert und allen Aufzählungswerten zugewiesen.
quelle
Hier sind einige verschiedene Möglichkeiten, um TypeScript-Aufzählungen zu implementieren .
Am einfachsten ist es, einfach über ein Objekt zu iterieren und dem Objekt invertierte Schlüssel-Wert-Paare hinzuzufügen. Der einzige Nachteil ist, dass Sie den Wert für jedes Mitglied manuell festlegen müssen.
Und hier ist ein Lodash-Mixin , um mit einer Zeichenfolge eine Aufzählung zu erstellen. Während diese Version etwas komplizierter ist, übernimmt sie die Nummerierung automatisch für Sie. Alle in diesem Beispiel verwendeten lodash-Methoden haben ein reguläres JavaScript-Äquivalent, sodass Sie sie bei Bedarf problemlos austauschen können.
quelle
Ich habe gerade ein NPM-Paket veröffentlicht. Mit gen_enum können Sie schnell eine Enum-Datenstruktur in Javascript erstellen:
Eine schöne Sache an diesem kleinen Tool ist, dass in einer modernen Umgebung (einschließlich NodeJS und IE 9+ Browsern) das zurückgegebene Enum-Objekt unveränderlich ist.
Weitere Informationen finden Sie unter https://github.com/greenlaw110/enumjs
Aktualisierung
Ich veraltete das
gen_enum
Paket und füge die Funktion in das constjs- Paket ein, das weitere Funktionen bietet, darunter unveränderliche Objekte, JSON-String-Deserialisierung, String-Konstanten und Bitmap-Generierung usw. Checkout https://www.npmjs.com/package/constjs Weitere Informationen finden Sie unterUm ein Upgrade von
gen_enum
aufconstjs
nur die Aussage ändernzu
quelle
Einfachste Lösung:
Erstellen
Wert erhalten
Schlüssel holen
quelle
Ich habe eine Enum-Klasse erstellt, die Werte UND Namen bei O (1) abrufen kann. Es kann auch ein Objektarray generiert werden, das alle Namen und Werte enthält.
Sie können es so initiieren:
So rufen Sie einen Wert ab (wie Enums in C #):
So rufen Sie einen Namen für einen Wert ab (kann mehrdeutig sein, wenn Sie denselben Wert für verschiedene Namen eingeben):
So erhalten Sie ein Array mit jedem Namen und Wert in einem Objekt:
Wird generieren:
Sie können auch die HTML-Auswahloptionen leicht erhalten:
Was gilt:
quelle
Obwohl in ES2015 nur statische Methoden (und keine statischen Eigenschaften) unterstützt werden (siehe auch hier , §15.2.2.2), können Sie seltsamerweise das Folgende mit Babel mit der
es2015
Voreinstellung verwenden:Ich fand, dass dies auch über Module hinweg wie erwartet funktioniert (z. B. Importieren der
CellState
Enumeration von einem anderen Modul) und auch, wenn ich ein Modul mit Webpack importiere.Der Vorteil dieser Methode gegenüber den meisten anderen Antworten besteht darin, dass Sie sie zusammen mit einer statischen Typprüfung (z. B. Flow ) verwenden können und zur Entwicklungszeit mithilfe der statischen Typprüfung behaupten können, dass Ihre Variablen, Parameter usw. spezifisch sind.
CellState
" enum "anstelle einer anderen Aufzählung (die nicht zu unterscheiden wäre, wenn Sie generische Objekte oder Symbole verwenden würden).aktualisieren
Der obige Code hat den Nachteil, dass man zusätzliche Objekte vom Typ erstellen
CellState
kann (obwohl man sie nicht den statischen Feldern von zuordnen kann,CellState
da sie eingefroren sind). Der unten verfeinerte Code bietet jedoch die folgenden Vorteile:CellState
mehr erstellt werdenDie
values
Funktion, die alle Instanzen der Aufzählung zurückgibt, muss den Rückgabewert nicht auf die oben beschriebene manuelle (und fehleranfällige) Weise erstellen.quelle
es7 way, (Iterator, Freeze), Verwendung:
Code:
quelle
So übersetzt Typescript es
enum
in Javascript:Jetzt:
Zuerst war ich verwirrt, warum
obj[1]
zurückgegeben wird'Active'
, aber dann wurde mir klar, dass es absolut einfach ist - Zuweisungsoperator weist Wert zu und gibt ihn dann zurück:quelle
Sie können so etwas tun
Wie in dieser Bibliothek definiert. https://github.com/webmodule/foo/blob/master/foo.js#L217
Vollständiges Beispiel https://gist.github.com/lnt/bb13a2fd63cdb8bce85fd62965a20026
quelle
Ein schneller und einfacher Weg wäre:
quelle
Stand: Oktober 2014 - hier ist also eine zeitgemäße Lösung. Ich schreibe die Lösung als Knotenmodul und habe einen Test mit Mocha und Chai sowie einen Unterstrich aufgenommen. Sie können diese leicht ignorieren und bei Bedarf einfach den Enum-Code verwenden.
Ich habe viele Posts mit übermäßig verschlungenen Bibliotheken usw. gesehen. Die Lösung, um Enum-Unterstützung in Javascript zu erhalten, ist so einfach, dass sie wirklich nicht benötigt wird. Hier ist der Code:
Datei: enums.js
Und ein Test, um zu veranschaulichen, was es Ihnen gibt:
Datei: enumsSpec.js
Wie Sie sehen können, erhalten Sie eine Enum-Factory, Sie können alle Schlüssel einfach durch Aufrufen von enum.keys abrufen und Sie können die Schlüssel selbst mit ganzzahligen Konstanten abgleichen. Sie können die Factory mit unterschiedlichen Werten wiederverwenden und die generierten Enums mithilfe des modularen Ansatzes von Node exportieren.
Wenn Sie nur ein gelegentlicher Benutzer sind oder im Browser usw., nehmen Sie einfach den werkseitigen Teil des Codes und entfernen Sie möglicherweise auch die Unterstrichbibliothek, wenn Sie ihn nicht in Ihrem Code verwenden möchten.
quelle
Es ist einfach zu bedienen, denke ich. https://stackoverflow.com/a/32245370/4365315
AKTUALISIEREN:
Es gibt meine Hilfscodes (
TypeHelper
).Code-Snippet anzeigen
quelle