𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Przejdźmy od razu do problemu: rozmiaru pliku. Każda inna odpowiedź wymieniona tutaj powoduje, że Twój kod jest skrajnie rozdęty. Przedstawiam wam, że dla najlepszej możliwej wydajności, czytelności kodu, zarządzania projektami na dużą skalę, podpowiedzi składniowych w wielu edytorach kodu i zmniejszenia rozmiaru kodu przez zmniejszenie, jest to właściwy sposób wykonywania wyliczeń: zmienne podkreślenia.
wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvw
Jak pokazano w powyższej tabeli i poniższym przykładzie, oto pięć łatwych kroków do rozpoczęcia:
- Określ nazwę grupy wyliczeń. Pomyśl o rzeczowniku, który może opisać cel wyliczenia lub przynajmniej wpisy w wyliczeniu. Na przykład grupa wyliczeń reprezentujących kolory wybrane przez użytkownika może być lepiej nazwana COLORCHOICES niż COLORS.
- Zdecyduj, czy wyliczenia w grupie wzajemnie się wykluczają, czy są niezależne. Jeśli wykluczają się wzajemnie, rozpocznij każdą wyliczoną nazwę zmiennej od
ENUM_
. Jeśli jest to niezależne lub używane obok siebie, użyj INDEX_
.
- Dla każdego wpisu utwórz nową zmienną lokalną, której nazwa zaczyna się od
ENUM_
lub INDEX_
, następnie nazwa grupy, następnie podkreślenie, a następnie unikalna przyjazna nazwa właściwości
- Dodać
ENUMLENGTH_
, ENUMLEN_
, INDEXLENGTH_
, lub INDEXLEN_
(niezależnie od tego LEN_
czy LENGTH_
jest preferencje osobiste) Zmienna wyliczone na samym końcu. Powinieneś używać tej zmiennej tam, gdzie to możliwe w swoim kodzie, aby mieć pewność, że dodanie dodatkowego wpisu do wyliczenia i zwiększenie tej wartości nie spowoduje uszkodzenia kodu.
- Daj każdej kolejnej zmiennej wyliczone wartości o jeden więcej niż w ubiegłym, zaczynając od 0. Istnieje komentarze na tej stronie, powiedzmy
0
nie powinny być stosowane jako Numeracja dlatego 0 == null
, 0 == false
, 0 == ""
i inne szaleństwa JS. Przekazuję Ci, że aby uniknąć tego problemu i jednocześnie zwiększyć wydajność, zawsze używaj ===
i nigdy nie pozwól, aby ==
pojawiał się w kodzie, z wyjątkiem typeof
(ex typeof X == "string"
). Przez wszystkie lata użytkowania ===
nigdy nie miałem problemu z użyciem 0 jako wartości wyliczenia. Jeśli nadal jesteś wrażliwy, 1
może być używany jako wartość początkowa w ENUM_
wyliczeniach (ale nie w INDEX_
wyliczeniach) bez utraty wydajności w wielu przypadkach.
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
}
Oto, jak pamiętam, kiedy INDEX_
i kiedy użyć ENUM_
:
// Precondition: var arr = []; //
arr[INDEX_] = ENUM_;
Jednakże, ENUM_
może w pewnych okolicznościach być odpowiednie jako wskaźnik taki jak przy liczeniu liczby wystąpień każdego elementu.
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]
});
Zauważ, że w powyższym kodzie naprawdę łatwo jest dodać nowy rodzaj zwierzaka: wystarczy dodać nowy wpis ENUM_PET_RAT
i ENUMLEN_PET
odpowiednio go zaktualizować . Dodanie nowego wpisu w innych systemach wyliczania może być trudniejsze i bardziej problematyczne.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvwvwvwvwvwwwww
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Ponadto ta składnia wyliczeń pozwala na jasne i zwięzłe rozszerzanie klas, jak pokazano poniżej. Aby przedłużyć klasę, dodaj rosnący numer do LEN_
pozycji klasy nadrzędnej. Następnie zakończ podklasę własnym LEN_
wpisem, aby podklasa mogła zostać w przyszłości rozszerzona.
(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);
(Długość: 2450 bajtów)
Niektórzy mogą powiedzieć, że jest to mniej praktyczne niż inne rozwiązania: zwalnia mnóstwo miejsca, zajmuje dużo czasu do pisania i nie jest pokryte składnią cukrową. Ci ludzie mieliby rację, gdyby nie zminimalizowali swojego kodu. Jednak żadna rozsądna osoba nie zostawiłaby nieuprawnionego kodu w produkcie końcowym. Do tej minimalizacji Kompilator Zamknięcia jest najlepszym, jaki jeszcze nie znalazłem. Dostęp online można znaleźć tutaj . Kompilator zamykania jest w stanie pobrać wszystkie dane wyliczenia i wstawić je, dzięki czemu JavaScript jest bardzo mały i szybko działa. Dlatego Minify z kompilatorem zamknięcia. Przestrzegać.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvwvwvwvwvwwwww
Kompilator Closure jest w stanie przeprowadzić pewne niewiarygodne optymalizacje za pomocą wnioskowania, które wykraczają daleko poza możliwości jakiegokolwiek innego minifigatora JavaScript. Kompilator zamknięcia może wstawiać pierwotne zmienne ustawione na stałą wartość. Kompilator zamknięcia może także dokonywać wnioskowania na podstawie tych wartości wprowadzonych i eliminować nieużywane bloki w instrukcjach if i pętlach.
'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);
(Długość: 605 bajtów)
Closure Compiler nagradza cię za inteligentniejsze kodowanie i porządne porządkowanie kodu, ponieważ podczas gdy wielu minifikatorów karze zorganizowany kod większym zmniejszonym rozmiarem pliku, Closure Compiler jest w stanie przesiać całą twoją czystość i rozsądek, aby uzyskać jeszcze mniejszy rozmiar pliku, jeśli używasz sztuczek jak wyliczenia nazw zmiennych. To, w tym jednym umyśle, jest święty graal kodowania: narzędzie, które zarówno wspomaga twój kod przy mniejszym pomniejszonym rozmiarze, jak i pomaga twojemu umysłowi, trenując lepsze nawyki programistyczne.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvwvwvwvwvwwwww
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Zobaczmy teraz, jak duży byłby równoważny plik bez tych wyliczeń.
Źródło bez
użycia wyliczeń (długość: 1973 bajtów (477 bajtów krótszych niż wyliczony kod!)) Zminimalizowane bez użycia wyliczeń (długość: 843 bajtów (238 bajtów dłuższych niż wyliczony kod ))
Jak widać, bez wyliczeń kod źródłowy jest krótszy kosztem większego zminimalizowanego kodu. Nie wiem jak ty; ale wiem na pewno, że nie dołączam kodu źródłowego do produktu końcowego. Dlatego ta forma wyliczania jest znacznie lepsza, ponieważ powoduje mniejsze mniejsze pliki.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvwvwvwvwvwwwww
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Kolejną zaletą tej formy wyliczania jest to, że można jej użyć do łatwego zarządzania projektami na dużą skalę bez poświęcania zminimalizowanego rozmiaru kodu. Podczas pracy nad dużym projektem z wieloma innymi osobami, może być korzystne wyraźne oznaczenie i oznaczenie nazw zmiennych, kto utworzył kod, aby można było szybko zidentyfikować oryginalnego twórcę kodu w celu wspólnego usuwania błędów.
// 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
}
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Ponadto ta forma wyliczenia jest również znacznie szybsza po zminimalizowaniu. W normalnych nazwanych właściwościach przeglądarka musi używać skrótów, aby sprawdzić, gdzie właściwość znajduje się na obiekcie. Chociaż kompilatory JIT inteligentnie buforują tę lokalizację na obiekcie, nadal występują ogromne koszty ogólne ze względu na specjalne przypadki, takie jak usunięcie niższej właściwości z obiektu.
Ale dzięki ciągłym, nierzadkim macierzom PACKED_ELEMENTS z indeksowaniem liczb całkowitych , przeglądarka może pominąć znaczną część tego narzutu, ponieważ indeks wartości w tablicy wewnętrznej jest już określony. Tak, zgodnie ze standardem ECMAScript wszystkie właściwości powinny być traktowane jako ciągi znaków. Niemniej jednak ten aspekt standardu ECMAScript jest bardzo mylący pod względem wydajności, ponieważ wszystkie przeglądarki mają specjalne optymalizacje dla indeksów numerycznych w tablicach.
/// Hashmaps are slow, even with JIT juice
var ref = {};
ref.count = 10;
ref.value = "foobar";
Porównaj powyższy kod z kodem poniżej.
/// 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";
Można sprzeciwić się kodowi z wyliczeniami, które wydają się znacznie dłuższe niż kod ze zwykłymi obiektami, ale wygląd może być mylący. Ważne jest, aby pamiętać, że rozmiar kodu źródłowego nie jest proporcjonalny do rozmiaru wyjściowego podczas korzystania z epickiego kompilatora Closure. Przestrzegać.
/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};
Zminimalizowany kod bez wyliczeń znajduje się powyżej, a zminimalizowany kod z wyliczeniami znajduje się poniżej.
/// Arrays, however, are always lightning fast
var a=[10,"foobar"];
Powyższy przykład pokazuje, że oprócz doskonałej wydajności, wyliczony kod skutkuje również mniejszym zminimalizowanym rozmiarem pliku.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvwvwvwvwvwwwww
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Co więcej, osobista wiśnia tego na górze korzysta z tej formy wyliczania wraz z edytorem tekstu CodeMirror w trybie Javascript. Tryb podświetlania składni JavaScript CodeMirror wyróżnia zmienne lokalne w bieżącym zakresie. W ten sposób od razu wiesz, kiedy poprawnie wpiszesz nazwę zmiennej, ponieważ jeśli nazwa zmiennej została wcześniej zadeklarowana var
słowem kluczowym, wówczas nazwa zmiennej zmienia kolor na specjalny (domyślnie błękitny). Nawet jeśli nie korzystasz z CodeMirror, przynajmniej przeglądarka rzuca pomocne[variable name] is not defined
wyjątek podczas wykonywania kodu z błędnie wpisanymi nazwami wyliczeń. Ponadto narzędzia JavaScript, takie jak JSLint i kompilator zamknięcia, bardzo głośno mówią o błędach w nazwie zmiennej wyliczeniowej. CodeMirror, przeglądarka i różne narzędzia JavaScript razem sprawiają, że debugowanie tej formy wyliczenia jest bardzo proste i bardzo łatwe.
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
}
W powyższym fragmencie został wyświetlony komunikat o błędzie, ponieważ ENUM_COLORENUM_DNE
nie istnieje.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvwvwvwvwvwwwww
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Myślę, że można bezpiecznie powiedzieć, że ta metodologia wyliczania jest rzeczywiście najlepszym sposobem, aby przejść nie tylko do zminimalizowania rozmiaru kodu, ale także do wydajności, debugowania i współpracy.
Po przeczytaniu pomocnego pytania dziękuję autorowi za poświęcenie czasu na pisanie, klikając lewą górną strzałkę w górę w polu pytania. Każde pole odpowiedzi ma także jedną z tych strzałek w górę.
0
jako numeru wyliczenia. Chyba że jest używany do czegoś, co nie zostało ustawione. JS traktujefalse || undefined || null || 0 || "" || '' || NaN
wszystko jako tę samą wartość w porównaniu z użyciem==
.