𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Mari kita langsung ke masalah: ukuran file. Setiap jawaban lain yang tercantum di sini membesar-besarkan kode Anda. Saya sampaikan kepada Anda bahwa untuk kinerja terbaik, keterbacaan kode, manajemen proyek skala besar, petunjuk sintaksis dalam banyak editor kode, dan pengurangan ukuran kode dengan minifikasi, ini adalah cara yang tepat untuk melakukan enumerasi: variabel garis bawah-notasi.
wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwv
Seperti ditunjukkan dalam bagan di atas dan contoh di bawah, berikut adalah lima langkah mudah untuk memulai:
- Tentukan nama untuk grup enumerasi. Pikirkan kata benda yang dapat menggambarkan tujuan pencacahan atau setidaknya entri dalam pencacahan. Misalnya, sekelompok enumerasi yang mewakili warna yang dipilih oleh pengguna mungkin lebih baik bernama COLORCHOICES daripada COLORS.
- Putuskan apakah pencacahan dalam grup adalah saling eksklusif atau independen. Jika saling eksklusif, mulai setiap nama variabel yang disebutkan dengan
ENUM_
. Jika independen atau berdampingan, gunakanINDEX_
.
- Untuk setiap entri, buat variabel lokal baru yang namanya dimulai dengan
ENUM_
atauINDEX_
, lalu nama grup, lalu garis bawah, lalu nama ramah unik untuk properti
- Tambahkan
ENUMLENGTH_
, ENUMLEN_
, INDEXLENGTH_
, atau INDEXLEN_
(apakah LEN_
atauLENGTH_
preferensi pribadi) variabel disebutkan di akhir. Anda harus menggunakan variabel ini sedapat mungkin dalam kode Anda untuk memastikan bahwa menambahkan entri tambahan ke enumerasi dan menambah nilai ini tidak akan merusak kode Anda.
- Berikan masing-masing variabel enumerated berturut-turut nilai satu lebih dari yang terakhir, mulai dari 0. Ada komentar di halaman ini yang mengatakan
0
tidak boleh digunakan sebagai nilai disebutkan karena 0 == null
, 0 == false
, 0 == ""
, dan kegilaan lainnya JS. Saya serahkan kepada Anda bahwa, untuk menghindari masalah ini dan meningkatkan kinerja pada saat yang sama, selalu gunakan ===
dan jangan pernah biarkan ==
muncul dalam kode Anda kecuali dengan typeof
(ex typeof X == "string"
). Dalam semua tahun saya menggunakan ===
, saya tidak pernah memiliki masalah dengan menggunakan 0 sebagai nilai enumerasi. Jika Anda masih mudah tersinggung, maka 1
dapat digunakan sebagai nilai awal dalam ENUM_
enumerasi (tetapi tidak dalam INDEX_
enumerasi) tanpa penalti kinerja dalam banyak kasus.
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
}
Berikut adalah bagaimana saya ingat kapan harus digunakan INDEX_
dan kapan harus digunakan ENUM_
:
// Precondition: var arr = []; //
arr[INDEX_] = ENUM_;
Namun, ENUM_
dapat, dalam keadaan tertentu, sesuai sebagai indeks seperti ketika menghitung kejadian setiap item.
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]
});
Perhatikan bahwa, dalam kode di atas, sangat mudah untuk menambahkan jenis hewan peliharaan baru: Anda hanya perlu menambahkan entri baru setelah ENUM_PET_RAT
dan memperbarui ENUMLEN_PET
sesuai. Mungkin lebih sulit dan sulit untuk menambahkan entri baru dalam sistem enumerasi lain.
wvwwvw wvwvwvw wvwxwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvww
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Selain itu, sintaks enumerasi ini memungkinkan perluasan kelas yang jelas dan ringkas seperti yang terlihat di bawah ini. Untuk memperluas kelas, tambahkan nomor yang bertambah ke LEN_
entri kelas induk. Kemudian, selesaikan subclass dengan LEN_
entri sendiri sehingga subclass dapat diperpanjang lebih lanjut di masa depan.
(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);
(Panjang: 2,450 byte)
Beberapa orang mungkin mengatakan bahwa ini kurang praktis daripada solusi lain: ia membutuhkan banyak ruang, butuh waktu lama untuk menulis, dan tidak dilapisi dengan sintaksis gula. Orang-orang itu akan benar jika mereka tidak mengubah kode mereka. Namun, tidak ada orang yang berakal yang akan meninggalkan kode yang tidak ditentukan dalam produk akhir. Untuk minifikasi ini, Closure Compiler adalah yang terbaik yang belum saya temukan. Akses online dapat ditemukan di sini . Compiler Closure dapat mengambil semua data enumerasi ini dan memasangnya, membuat Javascript Anda menjadi super duper kecil dan menjalankan super duper dengan cepat. Jadi, Minify with Closure Compiler. Mengamati.
wvwwvw wvwvwvw wvwxwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvww
Compiler Closure dapat melakukan beberapa optimasi yang sangat luar biasa melalui inferensi yang jauh melampaui kapasitas dari pengubah Javascript lainnya. Closure Compiler dapat inline variabel primitif diatur ke nilai tetap. Closure Compiler juga dapat membuat kesimpulan berdasarkan pada nilai yang diuraikan ini dan menghilangkan blok yang tidak digunakan dalam if-statement dan 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);
(Panjang: 605 byte)
Closure Compiler memberi Anda penghargaan untuk pengkodean yang lebih cerdas dan mengorganisasikan kode Anda dengan baik karena, sementara banyak minifiers menghukum kode terorganisir dengan ukuran file yang lebih kecil, Closure Compiler dapat menyaring semua kebersihan dan kewarasan Anda untuk menghasilkan ukuran file yang lebih kecil jika Anda menggunakan trik seperti enumerasi nama variabel. Itu, dalam satu pikiran ini, adalah grail suci pengkodean: alat yang keduanya membantu kode Anda dengan ukuran yang lebih kecil dan membantu pikiran Anda dengan melatih kebiasaan pemrograman yang lebih baik.
wvwwvw wvwvwvw wvwxwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvww
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Sekarang, mari kita lihat seberapa besar file ekuivalen tanpa enumerasi ini.
Sumber Tanpa Menggunakan Pencacahan (panjang: 1,973 byte (477 byte lebih pendek dari kode yang disebutkan!))
Diperkecil Tanpa Menggunakan Pencacahan (panjang: 843 byte ( lebih panjang 238 byte dari kode pencacahan ))
Seperti terlihat, tanpa enumerasi, kode sumber lebih pendek dengan biaya kode minified yang lebih besar. Saya tidak tahu tentang Anda; tapi saya tahu pasti bahwa saya tidak memasukkan kode sumber ke dalam produk akhir. Jadi, bentuk enumerasi ini jauh lebih unggul sehingga menghasilkan ukuran file yang lebih kecil.
wvwwvw wvwvwvw wvwxwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvww
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Keuntungan lain tentang bentuk enumerasi ini adalah dapat digunakan untuk mengelola proyek skala besar dengan mudah tanpa mengorbankan ukuran kode yang diperkecil. Ketika mengerjakan proyek besar dengan banyak orang lain, mungkin bermanfaat untuk secara eksplisit menandai dan memberi label nama variabel dengan siapa yang membuat kode sehingga pembuat kode asli dapat dengan cepat diidentifikasi untuk memperbaiki bug kolaboratif.
// 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
}
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Selanjutnya, bentuk enumerasi ini juga jauh lebih cepat setelah minifikasi. Dalam properti bernama normal, browser harus menggunakan hashmaps untuk mencari di mana properti itu pada objek. Meskipun kompiler JIT secara cerdas men-cache lokasi ini pada objek, masih ada overhead yang luar biasa karena kasus-kasus khusus seperti menghapus properti yang lebih rendah dari objek.
Tetapi, dengan array PACKED_ELEMENTS integer non-sparse yang diindeks terus menerus , browser dapat melewati sebagian besar overhead itu karena indeks nilai dalam array internal sudah ditentukan. Ya, menurut standar ECMAScript, semua properti seharusnya diperlakukan sebagai string. Namun demikian, aspek ini dari standar ECMAScript sangat menyesatkan tentang kinerja karena semua browser memiliki optimasi khusus untuk indeks numerik dalam array.
/// Hashmaps are slow, even with JIT juice
var ref = {};
ref.count = 10;
ref.value = "foobar";
Bandingkan kode di atas dengan kode di bawah ini.
/// 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";
Orang mungkin keberatan dengan kode dengan enumerasi yang nampaknya jauh lebih lama daripada kode dengan objek biasa, tetapi tampilannya bisa menipu. Penting untuk diingat bahwa ukuran kode sumber tidak sebanding dengan ukuran keluaran saat menggunakan Kompilator Penutupan epik. Mengamati.
/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};
Kode yang diperkecil tanpa enumerasi di atas dan kode yang diperkecil dengan enumerasi di bawah.
/// Arrays, however, are always lightning fast
var a=[10,"foobar"];
Contoh di atas menunjukkan bahwa, selain memiliki kinerja yang unggul, kode yang disebutkan juga menghasilkan ukuran file yang diperkecil lebih kecil.
wvwwvw wvwvwvw wvwxwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvww
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Selain itu, ceri pribadi yang satu ini di atas menggunakan bentuk enumerasi ini bersama dengan pengecualian CodeMirror editor teks dalam mode Javascript. Mode penyorotan Javascript CodeMirror menyoroti variabel lokal dalam cakupan saat ini. Dengan begitu, Anda langsung tahu kapan Anda mengetikkan nama variabel dengan benar karena jika nama variabel sebelumnya dinyatakan dengan ketika mengeksekusi kode dengan nama enumerasi yang salah ketik. Juga, alat JavaScript seperti JSLint dan Closure Compiler sangat keras untuk memberi tahu Anda ketika Anda salah ketik dalam nama variabel enumerasi. CodeMirror, browser, dan berbagai alat Javascript disatukan membuat debugging enumerasi bentuk ini sangat sederhana dan sangat mudah.var
kata kunci, maka nama variabel tersebut akan mengubah warna khusus (cyan secara default). Bahkan jika Anda tidak menggunakan CodeMirror, maka setidaknya browser memberikan bantuan[variable name] is not defined
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
}
Dalam cuplikan di atas, Anda diberitahu dengan kesalahan karena ENUM_COLORENUM_DNE
tidak ada.
wvwwvw wvwvwvw wvwxwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvww
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Saya pikir aman untuk mengatakan bahwa metodologi enumerasi ini memang cara terbaik untuk pergi tidak hanya untuk ukuran kode yang diperkecil, tetapi juga untuk kinerja, debugging, dan kolaborasi.
Setelah membaca pertanyaan yang bermanfaat, saya berterima kasih kepada penulis karena telah meluangkan waktu dalam tulisan mereka dengan mengklik tanda panah kiri atas di kotak pertanyaan. Setiap kotak jawaban juga memiliki salah satu dari panah atas ini.
0
sebagai nomor enumerasi. Kecuali itu digunakan untuk sesuatu yang belum diatur. JS memperlakukanfalse || undefined || null || 0 || "" || '' || NaN
semua sebagai nilai yang sama bila dibandingkan dengan menggunakan==
.