𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
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:
- Bestimmen Sie einen Namen für die Aufzählungsgruppe. Stellen Sie sich ein Substantiv vor, das den Zweck der Aufzählung oder zumindest die Einträge in der Aufzählung beschreiben kann. Beispielsweise kann eine Gruppe von Aufzählungen, die vom Benutzer auswählbare Farben darstellen, besser als COLORCHOICES als COLORS bezeichnet werden.
- Entscheiden Sie, ob sich Aufzählungen in der Gruppe gegenseitig ausschließen oder unabhängig sind. Wenn sich gegenseitig ausschließen, starten Sie jeden aufgezählten Variablennamen mit
ENUM_
. Wenn unabhängig oder nebeneinander, verwenden Sie INDEX_
.
- Erstellen Sie für jeden Eintrag eine neue lokale Variable, deren Name mit
ENUM_
oder beginnt INDEX_
, dann den Namen der Gruppe, dann einen Unterstrich und dann einen eindeutigen Anzeigenamen für die Eigenschaft
- Fügen Sie ein
ENUMLENGTH_
, ENUMLEN_
, INDEXLENGTH_
, oder INDEXLEN_
(ob LEN_
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.
- Geben Sie jeden aufeinander folgenden Aufzählungs Variable einen Wert eins mehr als die letzten, beginnend bei 0. Es gibt Kommentare auf dieser Seite , dass sagen sie
0
sollen nicht als Aufzählungswert verwendet werden , da 0 == 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 mit typeof
(ex typeof 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 in ENUM_
Aufzählungen (aber nicht in INDEX_
Aufzählungen) ohne Leistungseinbußen verwendet werden.
const ENUM_COLORENUM_RED = 0;
const ENUM_COLORENUM_GREEN = 1;
const ENUM_COLORENUM_BLUE = 2;
const ENUMLEN_COLORENUM = 3;
// later on
if(currentColor === ENUM_COLORENUM_RED) {
// whatever
}
So erinnere ich mich, wann INDEX_
und wann ich es verwenden soll ENUM_
:
// Precondition: var arr = []; //
arr[INDEX_] = ENUM_;
Jedoch ENUM_
kann unter bestimmten Umständen angemessen sein , als Index, wie wenn die Vorkommen der einzelnen Elemente zu zählen.
const ENUM_PET_CAT = 0,
ENUM_PET_DOG = 1,
ENUM_PET_RAT = 2,
ENUMLEN_PET = 3;
var favoritePets = [ENUM_PET_CAT, ENUM_PET_DOG, ENUM_PET_RAT,
ENUM_PET_DOG, ENUM_PET_DOG, ENUM_PET_CAT,
ENUM_PET_RAT, ENUM_PET_CAT, ENUM_PET_DOG];
var petsFrequency = [];
for (var i=0; i<ENUMLEN_PET; i=i+1|0)
petsFrequency[i] = 0;
for (var i=0, len=favoritePets.length|0, petId=0; i<len; i=i+1|0)
petsFrequency[petId = favoritePets[i]|0] = (petsFrequency[petId]|0) + 1|0;
console.log({
"cat": petsFrequency[ENUM_PET_CAT],
"dog": petsFrequency[ENUM_PET_DOG],
"rat": petsFrequency[ENUM_PET_RAT]
});
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 aktualisieren ENUMLEN_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 eigenen LEN_
Eintrag, damit die Unterklasse in Zukunft weiter erweitert werden kann.
(function(window){
"use strict";
var parseInt = window.parseInt;
// use INDEX_ when representing the index in an array instance
const INDEX_PIXELCOLOR_TYPE = 0, // is a ENUM_PIXELTYPE
INDEXLEN_PIXELCOLOR = 1,
INDEX_SOLIDCOLOR_R = INDEXLEN_PIXELCOLOR+0,
INDEX_SOLIDCOLOR_G = INDEXLEN_PIXELCOLOR+1,
INDEX_SOLIDCOLOR_B = INDEXLEN_PIXELCOLOR+2,
INDEXLEN_SOLIDCOLOR = INDEXLEN_PIXELCOLOR+3,
INDEX_ALPHACOLOR_R = INDEXLEN_PIXELCOLOR+0,
INDEX_ALPHACOLOR_G = INDEXLEN_PIXELCOLOR+1,
INDEX_ALPHACOLOR_B = INDEXLEN_PIXELCOLOR+2,
INDEX_ALPHACOLOR_A = INDEXLEN_PIXELCOLOR+3,
INDEXLEN_ALPHACOLOR = INDEXLEN_PIXELCOLOR+4,
// use ENUM_ when representing a mutually-exclusive species or type
ENUM_PIXELTYPE_SOLID = 0,
ENUM_PIXELTYPE_ALPHA = 1,
ENUM_PIXELTYPE_UNKNOWN = 2,
ENUMLEN_PIXELTYPE = 2;
function parseHexColor(inputString) {
var rawstr = inputString.trim().substring(1);
var result = [];
if (rawstr.length === 8) {
result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_ALPHA;
result[INDEX_ALPHACOLOR_R] = parseInt(rawstr.substring(0,2), 16);
result[INDEX_ALPHACOLOR_G] = parseInt(rawstr.substring(2,4), 16);
result[INDEX_ALPHACOLOR_B] = parseInt(rawstr.substring(4,6), 16);
result[INDEX_ALPHACOLOR_A] = parseInt(rawstr.substring(4,6), 16);
} else if (rawstr.length === 4) {
result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_ALPHA;
result[INDEX_ALPHACOLOR_R] = parseInt(rawstr[0], 16) * 0x11;
result[INDEX_ALPHACOLOR_G] = parseInt(rawstr[1], 16) * 0x11;
result[INDEX_ALPHACOLOR_B] = parseInt(rawstr[2], 16) * 0x11;
result[INDEX_ALPHACOLOR_A] = parseInt(rawstr[3], 16) * 0x11;
} else if (rawstr.length === 6) {
result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_SOLID;
result[INDEX_SOLIDCOLOR_R] = parseInt(rawstr.substring(0,2), 16);
result[INDEX_SOLIDCOLOR_G] = parseInt(rawstr.substring(2,4), 16);
result[INDEX_SOLIDCOLOR_B] = parseInt(rawstr.substring(4,6), 16);
} else if (rawstr.length === 3) {
result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_SOLID;
result[INDEX_SOLIDCOLOR_R] = parseInt(rawstr[0], 16) * 0x11;
result[INDEX_SOLIDCOLOR_G] = parseInt(rawstr[1], 16) * 0x11;
result[INDEX_SOLIDCOLOR_B] = parseInt(rawstr[2], 16) * 0x11;
} else {
result[INDEX_PIXELCOLOR_TYPE] = ENUM_PIXELTYPE_UNKNOWN;
}
return result;
}
// the red component of green
console.log(parseHexColor("#0f0")[INDEX_SOLIDCOLOR_R]);
// the alpha of transparent purple
console.log(parseHexColor("#f0f7")[INDEX_ALPHACOLOR_A]);
// the enumerated array for turquoise
console.log(parseHexColor("#40E0D0"));
})(self);
(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.
'use strict';(function(e){function d(a){a=a.trim().substring(1);var b=[];8===a.length?(b[0]=1,b[1]=c(a.substring(0,2),16),b[2]=c(a.substring(2,4),16),b[3]=c(a.substring(4,6),16),b[4]=c(a.substring(4,6),16)):4===a.length?(b[1]=17*c(a[0],16),b[2]=17*c(a[1],16),b[3]=17*c(a[2],16),b[4]=17*c(a[3],16)):6===a.length?(b[0]=0,b[1]=c(a.substring(0,2),16),b[2]=c(a.substring(2,4),16),b[3]=c(a.substring(4,6),16)):3===a.length?(b[0]=0,b[1]=17*c(a[0],16),b[2]=17*c(a[1],16),b[3]=17*c(a[2],16)):b[0]=2;return b}var c=
e.parseInt;console.log(d("#0f0")[1]);console.log(d("#f0f7")[4]);console.log(d("#40E0D0"))})(self);
(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.
// JG = Jack Giffin
const ENUM_JG_COLORENUM_RED = 0,
ENUM_JG_COLORENUM_GREEN = 1,
ENUM_JG_COLORENUM_BLUE = 2,
ENUMLEN_JG_COLORENUM = 3;
// later on
if(currentColor === ENUM_JG_COLORENUM_RED) {
// whatever
}
// PL = Pepper Loftus
// BK = Bob Knight
const ENUM_PL_ARRAYTYPE_UNSORTED = 0,
ENUM_PL_ARRAYTYPE_ISSORTED = 1,
ENUM_BK_ARRAYTYPE_CHUNKED = 2, // added by Bob Knight
ENUM_JG_ARRAYTYPE_INCOMPLETE = 3, // added by jack giffin
ENUMLEN_PL_COLORENUM = 4;
// later on
if(
randomArray === ENUM_PL_ARRAYTYPE_UNSORTED ||
randomArray === ENUM_BK_ARRAYTYPE_CHUNKED
) {
// whatever
}
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
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.
/// Hashmaps are slow, even with JIT juice
var ref = {};
ref.count = 10;
ref.value = "foobar";
Vergleichen Sie den obigen Code mit dem folgenden Code.
/// Arrays, however, are always lightning fast
const INDEX_REFERENCE_COUNT = 0;
const INDEX_REFERENCE_VALUE = 1;
const INDEXLENGTH_REFERENCE = 2;
var ref = [];
ref[INDEX_REFERENCE_COUNT] = 10;
ref[INDEX_REFERENCE_VALUE] = "foobar";
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.
/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};
Der minimierte Code ohne Aufzählungen ist oben und der minimierte Code mit Aufzählungen ist unten.
/// Arrays, however, are always lightning fast
var a=[10,"foobar"];
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.
const ENUM_COLORENUM_RED = 0,
ENUM_COLORENUM_GREEN = 1,
ENUM_COLORENUM_BLUE = 2,
ENUMLEN_COLORENUM = 3;
var currentColor = ENUM_COLORENUM_GREEN;
if(currentColor === ENUM_COLORENUM_RED) {
// whatever
}
if(currentColor === ENUM_COLORENUM_DNE) {
// whatever
}
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.
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==
.