𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Passiamo subito al problema: dimensione del file. Ogni altra risposta elencata qui blocca il tuo codice all'estremo. Vi presento che per le migliori prestazioni possibili, la leggibilità del codice, la gestione di progetti su larga scala, il suggerimento di sintassi in molti editor di codice e la riduzione delle dimensioni del codice mediante minificazione, questo è il modo corretto di fare le enumerazioni: variabili di sottolineatura.
wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwv
Come dimostrato nella tabella sopra e nell'esempio seguente, ecco cinque semplici passaggi per iniziare:
- Determinare un nome per il gruppo di enumerazione. Pensa a un sostantivo che può descrivere lo scopo dell'enumerazione o almeno le voci dell'enumerazione. Ad esempio, un gruppo di enumerazioni che rappresentano i colori selezionabili dall'utente potrebbe essere meglio chiamato COLORCHOICES che COLORS.
- Decidere se le enumerazioni nel gruppo si escludono a vicenda o indipendenti. Se si escludono a vicenda, avviare ciascun nome di variabile enumerato con
ENUM_
. Se indipendente o affiancato, utilizzareINDEX_
.
- Per ogni voce, creare una nuova variabile locale il cui nome inizia con
ENUM_
oINDEX_
, quindi il nome del gruppo, quindi un carattere di sottolineatura, quindi un nome descrittivo univoco per la proprietà
- Aggiungi un
ENUMLENGTH_
, ENUMLEN_
, INDEXLENGTH_
, o INDEXLEN_
(se LEN_
o LENGTH_
è preferenze personali) variabile enumerato proprio alla fine. Dovresti usare questa variabile ove possibile nel tuo codice per assicurarti che l'aggiunta di una voce extra all'enumerazione e l'incremento di questo valore non rompano il tuo codice.
- Dare ad ogni variabile enumerato successivo un valore uno in più l'ultimo, a partire da 0. Non ci sono commenti su questa pagina che diciamo
0
non deve essere usato come un valore enumerato perché 0 == null
, 0 == false
, 0 == ""
, e altre follie JS. Sottolineo che, per evitare questo problema e aumentare le prestazioni allo stesso tempo, utilizzare sempre ===
e non lasciare mai ==
apparire nel proprio codice se non con typeof
(ex typeof X == "string"
). In tutti i miei anni di utilizzo ===
, non ho mai avuto problemi con l'utilizzo di 0 come valore di enumerazione. Se sei ancora schizzinoso, 1
potrebbe essere usato come valore iniziale nelle ENUM_
enumerazioni (ma non nelle INDEX_
enumerazioni) senza penalità di prestazione in molti casi.
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
}
Ecco come ricordo quando usare INDEX_
e quando usare ENUM_
:
// Precondition: var arr = []; //
arr[INDEX_] = ENUM_;
Tuttavia, ENUM_
in determinate circostanze, può essere appropriato come indice, ad esempio quando si contano le occorrenze di ciascun elemento.
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]
});
Ricorda che, nel codice sopra, è davvero facile aggiungere un nuovo tipo di animale domestico: dovrai solo aggiungere una nuova voce dopo ENUM_PET_RAT
e aggiornare di ENUMLEN_PET
conseguenza. Potrebbe essere più difficile e corretto aggiungere una nuova voce in altri sistemi di enumerazione.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwwvwwwwwwwwww
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Inoltre, questa sintassi delle enumerazioni consente l'estensione della classe chiara e concisa, come mostrato di seguito. Per estendere una classe, aggiungere un numero incrementale alla LEN_
voce della classe genitore. Quindi, completare la sottoclasse con la propria LEN_
voce in modo che la sottoclasse possa essere estesa ulteriormente in futuro.
(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);
(Lunghezza: 2.450 byte)
Alcuni potrebbero dire che questo è meno pratico di altre soluzioni: rinuncia a tonnellate di spazio, impiega molto tempo a scrivere e non è ricoperto di sintassi dello zucchero. Quelle persone avrebbero ragione se non minimizzassero il loro codice. Tuttavia, nessuna persona ragionevole lascerebbe un codice non miniato nel prodotto finale. Per questa minificazione, Closure Compiler è il migliore che devo ancora trovare. L'accesso online è disponibile qui . Il compilatore di chiusura è in grado di prendere tutti questi dati di enumerazione e incorporarli, rendendo il tuo Javascript super-piccolo e veloce da eseguire. Pertanto, minimizza con il compilatore di chiusura. Osservare.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwwvwwwwwwwwww
Il compilatore di chiusura è in grado di eseguire alcune incredibili ottimizzazioni tramite inferenze che vanno ben oltre le capacità di qualsiasi altro minificatore Javascript. Il compilatore di chiusura è in grado di incorporare variabili primitive impostate su un valore fisso. Closure Compiler è anche in grado di fare inferenze basate su questi valori incorporati ed eliminare blocchi non utilizzati in istruzioni if e loop.
'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);
(Lunghezza: 605 byte)
Closure Compiler ti premia per la codifica più intelligente e l'organizzazione del tuo codice perché perché, mentre molti minificatori puniscono il codice organizzato con una dimensione di file minimizzata più grande, Closure Compiler è in grado di setacciare tutta la tua pulizia e sanità mentale per produrre una dimensione di file ancora più piccola se usi i trucchi come le enumerazioni dei nomi delle variabili. Questo, in questa unica mente, è il santo graal della codifica: uno strumento che assiste il tuo codice con una dimensione ridotta più piccola e assiste la tua mente allenando migliori abitudini di programmazione.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwwvwwwwwwwwww
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Vediamo ora quanto sarebbe grande il file equivalente senza nessuna di queste enumerazioni.
Sorgente senza utilizzo delle enumerazioni (lunghezza: 1.973 byte (477 byte più brevi del codice enumerato!))
Minimizzato senza l'utilizzo delle enumerazioni (lunghezza: 843 byte (238 byte in più del codice enumerato ))
Come visto, senza enumerazioni, il codice sorgente è più breve al costo di un codice minimizzato più grande. Non so di te; ma so per certo che non incorporo il codice sorgente nel prodotto finale. Pertanto, questa forma di enumerazioni è di gran lunga superiore in quanto determina dimensioni di file ridotte al minimo.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwwvwwwwwwwwww
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Un altro vantaggio di questa forma di enumerazione è che può essere utilizzato per gestire facilmente progetti su larga scala senza sacrificare la dimensione del codice minimizzata. Quando si lavora su un grande progetto con molte altre persone, potrebbe essere utile contrassegnare ed etichettare esplicitamente i nomi delle variabili con chi ha creato il codice in modo che l'autore originale del codice possa essere rapidamente identificato per la correzione collaborativa dei bug.
// 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
}
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Inoltre, questa forma di enumerazione è anche molto più veloce dopo la minificazione. Nelle normali proprietà denominate, il browser deve utilizzare hashmaps per cercare dove si trova la proprietà sull'oggetto. Sebbene i compilatori JIT memorizzino nella cache in modo intelligente questa posizione sull'oggetto, c'è ancora un enorme sovraccarico a causa di casi speciali come l'eliminazione di una proprietà inferiore dall'oggetto.
Tuttavia, con array PACKED_ELEMENTS continui non indicizzati con indice intero , il browser è in grado di saltare gran parte di tale sovraccarico poiché l'indice del valore nell'array interno è già specificato. Sì, secondo lo standard ECMAScript, tutte le proprietà dovrebbero essere trattate come stringhe. Tuttavia, questo aspetto dello standard ECMAScript è molto fuorviante in termini di prestazioni perché tutti i browser hanno ottimizzazioni speciali per gli indici numerici negli array.
/// Hashmaps are slow, even with JIT juice
var ref = {};
ref.count = 10;
ref.value = "foobar";
Confronta il codice sopra con il codice sotto.
/// 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";
Si potrebbe obiettare al codice con enumerazioni che sembrano essere molto più lunghe del codice con oggetti ordinari, ma l'aspetto può essere ingannevole. È importante ricordare che la dimensione del codice sorgente non è proporzionale alla dimensione dell'output quando si utilizza l'epic Closure Compiler. Osservare.
/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};
Il codice minimizzato senza enumerazioni è sopra e il codice minimizzato con enumerazioni è sotto.
/// Arrays, however, are always lightning fast
var a=[10,"foobar"];
L'esempio sopra dimostra che, oltre ad avere prestazioni superiori, il codice enumerato comporta anche una dimensione di file ridotta di dimensioni minime.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwwvwwwwwwwwww
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Inoltre, questa ciliegina personale in cima sta usando questa forma di enumerazioni insieme all'editor di testo CodeMirror in modalità Javascript. La modalità di evidenziazione della sintassi Javascript di CodeMirror evidenzia le variabili locali nell'ambito corrente. In questo modo, sai immediatamente quando digiti correttamente un nome di variabile perché se il nome della variabile è stato precedentemente dichiarato con la var
parola chiave, il nome della variabile diventa un colore speciale (ciano per impostazione predefinita). Anche se non usi CodeMirror, almeno il browser genera un utile[variable name] is not defined
eccezione durante l'esecuzione di codice con nomi di enumerazione errati. Inoltre, strumenti JavaScript come JSLint e Closure Compiler sono molto rumorosi nel dirti quando si digita male in un nome di variabile di enumerazione. CodeMirror, il browser e vari strumenti Javascript messi insieme rendono il debug di questa forma di enumerazione molto semplice e davvero facile.
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
}
Nel frammento di cui sopra, sei stato avvisato con un errore perché ENUM_COLORENUM_DNE
non esiste.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwwvwwwwwwwwww
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Penso che sia sicuro affermare che questa metodologia di enumerazione è davvero il modo migliore di andare non solo per la dimensione del codice minimizzata, ma anche per le prestazioni, il debug e la collaborazione.
Dopo aver letto una domanda utile, ringrazio l'autore per aver dedicato del tempo alla sua scrittura facendo clic sulla freccia in alto a sinistra in alto nella casella della domanda. Ogni casella di risposta ha anche una di queste frecce verso l'alto.
0
come numero di enumerazione. A meno che non sia usato per qualcosa che non è stato impostato. JS considerafalse || undefined || null || 0 || "" || '' || NaN
tutti lo stesso valore rispetto all'utilizzo==
.