𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Давайте вирішимо проблему: розмір файлу. Кожна інша відповідь, перерахована тут, роздуває ваш край до кінця. Представляю вам, що для найкращої продуктивності, читабельності коду, управління масштабними проектами, натяку на синтаксис у багатьох редакторах коду та зменшення розміру коду шляхом мінімізації це правильний спосіб зробити перерахування: змінні підкреслення-позначення.
wvwvwvwvwwwwwwwwwwwwwwwwwwwwwwwwwwwvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
Як показано на графіку вище та прикладі нижче, ось п’ять простих кроків для початку:
- Визначте назву для групи перерахування. Придумайте іменник, який може описати мету перерахування або хоча б записи в перерахунку. Наприклад, група перерахувань, що представляють обрані користувачем кольори, може бути краще названа COLORCHOICES ніж COLORS.
- Вирішіть, чи перерахування в групі взаємно виключають чи незалежні. Якщо взаємовиключні, почніть кожне перелічене ім'я змінної з
ENUM_
. Якщо це незалежно або поруч, використовуйте INDEX_
.
- Для кожного запису створіть нову локальну змінну, назва якої починається з
ENUM_
або INDEX_
, потім назва групи, потім підкреслення, а потім унікальне дружнє ім’я для властивості
- Додати
ENUMLENGTH_
, ENUMLEN_
, INDEXLENGTH_
або INDEXLEN_
(незалежно від того LEN_
чиLENGTH_
це особиста перевага) перераховане змінної в самому кінці. Ви повинні використовувати цю змінну, коли це можливо, у своєму коді, щоб гарантувати, що додавання додаткового запису до перерахунку та збільшення цього значення не порушить ваш код.
- Дайте кожний наступний перенумерували змінним значення одного більше , ніж в минулому, починаючи з 0. Є коментарі на цій сторінці, наприклад ,
0
не слід використовувати в якості перерахованого значення , так як 0 == null
, 0 == false
, 0 == ""
та інші JS божевілля. Я підтверджую, що, щоб уникнути цієї проблеми та одночасно підвищити продуктивність, завжди використовуйте ===
та ніколи не дозволяйте ==
відображатися у вашому коді, за винятком typeof
(ex typeof X == "string"
). За всі мої роки використання у ===
мене ніколи не виникало проблем із використанням 0 як значення перерахунку. Якщо ви все ще химерні, то їх 1
можна використовувати як вихідне значення в ENUM_
перерахуваннях (але не в INDEX_
перерахунках) без штрафу за ефективність у багатьох випадках.
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
}
Ось як я пам’ятаю, коли користуватися INDEX_
та коли користуватися ENUM_
:
// Precondition: var arr = []; //
arr[INDEX_] = ENUM_;
Однак, ENUM_
може, за певних обставин, бути відповідним як індекс, наприклад, під час підрахунку подій кожного елемента.
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]
});
Зауважте, що в наведеному вище коді додати новий вид домашньої тварини дуже просто: вам просто доведеться додати новий запис після цього ENUM_PET_RAT
та оновити ENUMLEN_PET
відповідно. Можливо, буде складніше і невдало додати новий запис до інших систем перерахування.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwww wvwvw wvwvwv vwvxwvw wvwvww wvwwvw wvwxxww
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Крім того, цей синтаксис перерахунків дозволяє чітко і стисло розширювати клас, як показано нижче. Щоб розширити клас, додайте збільшуючий номер до LEN_
запису батьківського класу. Потім закінчіть підклас із власним LEN_
записом, щоб у майбутньому підклас можна було продовжити.
(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);
(Довжина: 2450 байт)
Деякі можуть сказати, що це менш практично, ніж інші рішення: воно забирає багато тонн місця, писати потрібно багато часу, і воно не покрите синтаксисом цукру. Ці люди були б праві, якщо вони не зміщують свій код. Однак жодна розумна людина не залишить незмінений код у кінцевому продукті. Для цього вдосконалення компілятор закриття - найкраще, що я мав ще знайти. Доступ до Інтернету можна знайти тут . Компілятор закриття може взяти всі ці дані перерахування та ввести їх, зробивши ваш Javascript дуже малим та запустити супер-пупер швидко. Таким чином, Minify with Closure Compiler. Поспостерігайте.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwww wvwvw wvwvwv vwvxwvw wvwvww wvwwvw wvwxxww
Компілятор закриття може виконати кілька неймовірних оптимізацій за допомогою висновків, що виходять за рамки можливостей будь-якого іншого міні-JavaScript Javascript. Компілятор закриття може вбудовувати примітивні змінні, встановлені на фіксоване значення. Компілятор закриття також може робити висновки на основі цих вкладених значень та виключати невикористані блоки в if-операторах та циклі.
'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);
(Довжина: 605 байт)
Компілятор закриття винагороджує вас за кодування розумнішого та добре впорядкованого коду, оскільки, хоча багато мініфієри карають організований код більшим мінімізованим розміром файлу, компілятор закриття здатний просіяти всю вашу чистоту та розумність, щоб вивести ще менший розмір файлу, якщо ви використовуєте трюки як перерахування імен змінних. Це, з урахуванням цього, святий грааль кодування: інструмент, який одночасно допомагає вашому коду з меншим мінімізованим розміром і допомагає вашому розуму, навчаючи кращих навичок програмування.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwww wvwvw wvwvwv vwvxwvw wvwvww wvwwvw wvwxxww
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Тепер давайте подивимось, який би великий еквівалентний файл без жодного з цих перерахувань.
Джерело без використання перерахунків (довжина: 1,973 байт (477 байт коротше перерахованого коду!))
Мінімізовано без використання перерахунків (довжина: 843 байти (238 байт довше перерахованого коду ))
Як видно, без перерахунків вихідний код коротший за вартість більшого мінімізованого коду. Я не знаю про тебе; але я точно знаю, що не включаю вихідний код у кінцевий продукт. Таким чином, ця форма перерахувань набагато перевершує те, що призводить до менших розмірів мінімізованих файлів.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwww wvwvw wvwvwv vwvxwvw wvwvww wvwwvw wvwxxww
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Ще одна перевага щодо цієї форми перерахування полягає в тому, що з її допомогою можна легко керувати масштабними проектами без шкоди для мінімізованого розміру коду. Працюючи над великим проектом з великою кількістю інших людей, може бути корисним чітко позначити і позначити імена змінних, хто створив код, щоб оригінальний творець коду був швидко ідентифікований для спільного виправлення помилок.
// 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
}
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Крім того, ця форма перерахування також набагато швидша після мінімізації. У звичайних названих властивостях браузер повинен використовувати хеш-карти, щоб шукати, де властивість знаходиться на об'єкті. Хоча компілятори JIT інтелектуально кешують це місце на об'єкті, все ще є величезна накладні витрати через особливі випадки, такі як видалення нижчого властивості з об'єкта.
Але, використовуючи безперервні маси, що не індексуються цілими числами PACKED_ELEMENTS , браузер може пропустити велику частину цих накладних витрат, оскільки індекс значення у внутрішньому масиві вже вказаний. Так, згідно стандарту ECMAScript, всі властивості повинні розглядатися як рядки. Тим не менш, цей аспект стандарту ECMAScript дуже вводить в оману щодо продуктивності, оскільки всі браузери мають спеціальні оптимізації для числових індексів у масивах.
/// Hashmaps are slow, even with JIT juice
var ref = {};
ref.count = 10;
ref.value = "foobar";
Порівняйте код вище із кодом нижче.
/// 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";
Можна заперечувати проти коду з перерахуваннями, які здаються набагато довшими, ніж код із звичайними об'єктами, але зовнішній вигляд може обманювати. Важливо пам’ятати, що розмір вихідного коду не пропорційний розміру виводу при використанні компілятора епічного закриття. Поспостерігайте.
/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};
Мінімізований код без перерахунків внизу, а мінімізований код із перерахунками - внизу.
/// Arrays, however, are always lightning fast
var a=[10,"foobar"];
Наведений вище приклад демонструє, що, окрім високої продуктивності, перелічений код також призводить до меншого розміру мінімізованого файлу.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwww wvwvw wvwvwv vwvxwvw wvwvww wvwwvw wvwxxww
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Крім того, ця особиста вишня у верхній частині використовує цю форму перерахування разом із текстовим редактором CodeMirror у режимі Javascript. Режим підсвічування синтаксису JavaScript CodeMirror виділяє локальні змінні в поточній області. Таким чином, ви моментально знаєте, коли правильно вводити ім'я змінної, тому що якщо ім'я змінної раніше було оголошено заvar
ключового слова, то ім'я змінної набуває особливого кольору (cyan за замовчуванням). Навіть якщо ви не використовуєте CodeMirror, тоді принаймні браузер видає корисний[variable name] is not defined
виняток при виконанні коду з неправильно вказаними іменами перерахування. Крім того, такі інструменти JavaScript, як JSLint і Closure Compiler, дуже голосно розповідають про те, що ви вводите помилку в назві змінної перерахування. CodeMirror, браузер та різні інструменти Javascript роблять налагодження цієї форми перерахування дуже простою та дуже простою.
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
}
У наведеному вище фрагменті вам надійшло повідомлення про помилку, оскільки ENUM_COLORENUM_DNE
його не існує.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwww wvwvw wvwvwv vwvxwvw wvwvww wvwwvw wvwxxww
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Я думаю, що можна сказати, що ця методологія перерахування - це найкращий спосіб не лише для мінімізованого розміру коду, але й для продуктивності, налагодження та співпраці.
Прочитавши корисне запитання, я дякую авторові за те, що він вклав час у їх написання, натиснувши верхню ліву стрілку вгору у полі запитання. У кожному полі відповідей також є одна із цих стрілок вгору.
0
як перелічувальний номер. Якщо тільки він не використовується для чогось, що не було встановлено. JS розглядаєfalse || undefined || null || 0 || "" || '' || NaN
всі як однакове значення у порівнянні з використанням==
.