𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Sorunu doğruca keselim: dosya boyutu. Burada listelenen diğer tüm cevaplar kodunuzu aşırı derecede şişirir. Size mümkün olan en iyi performans, kodun okunabilirliği, büyük ölçekli proje yönetimi, birçok kod editöründe sözdizimi ipucu ve kod boyutunun minyatürle azaltılması için numaralandırma yapmak için doğru yoldur: alt çizgi gösterim değişkenleri.
wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwv
Yukarıdaki grafikte ve aşağıdaki örnekte gösterildiği gibi, başlamak için beş kolay adım şunlardır:
- Numaralandırma grubu için bir ad belirleyin. Sayımın amacını veya en azından sayımdaki girişleri tanımlayabilen bir isim düşünün. Örneğin, kullanıcı tarafından seçilebilen renkleri temsil eden bir grup numaralandırma, COLORCHOICES olarak COLOR'dan daha iyi adlandırılabilir.
- Gruptaki numaralandırmaların birbirini dışlayan veya bağımsız olup olmadığına karar verin. Karşılıklı olarak dışlanmışsa, numaralandırılmış her değişken adını ile başlatın
ENUM_
. Bağımsız veya yan yana ise kullanın INDEX_
.
- Her giriş için adı
ENUM_
veya ile başlayan yeni bir yerel değişken oluşturun INDEX_
, ardından grubun adı, ardından bir alt çizgi, ardından mülk için benzersiz bir kolay ad
- Bir ekleme
ENUMLENGTH_
, ENUMLEN_
, INDEXLENGTH_
veya INDEXLEN_
(ister LEN_
ya LENGTH_
çok sonundadır kişisel tercih) sayılan değişkeni. Numaralandırmaya fazladan bir giriş eklemenin ve bu değerin artırılmasının kodunuzu kırmayacağından emin olmak için kodunuzda bu değişkeni mümkün olan her yerde kullanmalısınız.
- Diyelim ki bu sayfadaki yorum yapılmamış 0'dan başlamak üzere öncekinden daha birbirini izleyen her numaralandırılmış değişkeni bir değer tek ver
0
bir sayılan değer çünkü olarak kullanılmamalıdır 0 == null
, 0 == false
, 0 == ""
ve diğer JS delilik. Bu sorunu önlemek ve performansı aynı anda artırmak için, (ex ) dışında kodunuzda her zaman kullanın ===
ve asla izin vermeyin . Kullandığım tüm yıllar boyunca, bir zamanlar numaralandırma değeri olarak 0'ı kullanmakla ilgili bir sorunum olmadı. Hala gıcırdayorsanız, birçok durumda performans cezası olmadan numaralandırmalarda (ancak numaralandırmalarda değil ) başlangıç değeri olarak kullanılabilir .==
typeof
typeof X == "string"
===
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
}
İşte ne zaman INDEX_
ve ne zaman kullanacağımı hatırlıyorum ENUM_
:
// Precondition: var arr = []; //
arr[INDEX_] = ENUM_;
Ancak, ENUM_
bazı durumlarda, her bir öğenin oluşumunu sayarken bir dizin olarak uygun olabilir.
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]
});
Yukarıdaki kodda, yeni bir evcil hayvan türüne eklemek gerçekten kolay olduğunu gözlemleyin: sadece yeni bir giriş eklemeniz ENUM_PET_RAT
ve ENUMLEN_PET
buna göre güncelleme yapmanız gerekir . Diğer numaralandırma sistemlerine yeni bir giriş eklemek daha zor ve buggy olabilir.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwvvv
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Ek olarak, bu numaralandırma sözdizimi, aşağıda görüldüğü gibi açık ve özlü sınıf genişlemesine olanak tanır. Bir sınıfı genişletmek için LEN_
, üst sınıfın girişine artan bir sayı ekleyin . Ardından, alt LEN_
sınıfın ileride genişletilebilmesi için alt sınıfı kendi girişiyle bitirin .
(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);
(Uzunluk: 2.450 bayt)
Bazıları bunun diğer çözümlerden daha az pratik olduğunu söyleyebilir: tonlarca alandan feragat eder, yazmak uzun zaman alır ve şeker sözdizimi ile kaplanmaz. Bu insanlar kodlarını küçültmezlerse haklı olurlar. Bununla birlikte, hiçbir makul kişi nihai üründe minimum kod bırakmaz. Bu minimizasyon için, Closure Compiler henüz bulabildiğim en iyisi. Çevrimiçi erişim burada bulunabilir . Kapatma derleyici tüm bu numaralandırma verilerini almak ve satır içi, böylece Javascript süper küçük süper ve süper süper süper çalıştırmak yapabilirsiniz. Böylece, Kapatma Derleyici ile Küçült. Gözlemek.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwvvv
Kapatma derleyicisi, diğer herhangi bir Javascript minifier'ın kapasitesinin çok ötesinde olan çıkarımlar yoluyla oldukça inanılmaz bazı optimizasyonlar gerçekleştirebilir. Kapatma Derleyici sabit bir değere ayarlanmış ilkel değişkenleri satır içi yapabilmektedir. Closure Derleyici ayrıca bu satır içi değerlere dayalı çıkarımlar yapabilir ve if ifadeleri ve döngülerdeki kullanılmayan blokları ortadan kaldırabilir.
'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);
(Uzunluk: 605 bayt)
Closure Compiler, daha akıllı kodlama ve kodunuzu iyi organize etmeniz için sizi ödüllendirir, çünkü birçok minimizer organize kodu daha büyük küçültülmüş dosya boyutuyla cezalandırırken, Closure Compiler, hileler kullanırsanız daha küçük bir dosya boyutu elde etmek için tüm temizlik ve akıl sağlığınızı gözden geçirebilir değişken ad numaralandırmaları gibi. Bu, bir akılda, kodlamanın kutsal kâsesi: hem kodunuza daha küçük boyutta yardımcı olan hem de daha iyi programlama alışkanlıkları geliştirerek zihninize yardımcı olan bir araç.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwvvv
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Şimdi, bu numaralandırmalardan herhangi biri olmadan eşdeğer dosyanın ne kadar büyük olacağını görelim.
Numaralandırma Kullanmadan Kaynak (uzunluk: 1.973 bayt (numaralandırılmış koddan 477 bayt daha kısa!))
Numaralandırma Kullanmadan Küçültülmüş (uzunluk: 843 bayt ( numaralandırılmış koddan 238 bayt daha uzun ))
Görüldüğü gibi, numaralandırma olmadan, kaynak kodu daha büyük bir küçültülmüş kodun maliyetiyle daha kısadır. Seni tanımıyorum; ancak kaynak kodun son ürüne eklenmediğinden eminim. Bu nedenle, bu numaralandırma biçimi, dosya boyutlarının küçültülmesiyle sonuçlanamayacak kadar üstündür.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwvvv
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Bu numaralandırma formunun bir diğer avantajı, küçültülmüş kod boyutundan ödün vermeden büyük ölçekli projeleri kolayca yönetmek için kullanılabilmesidir. Çok sayıda başka insanla birlikte büyük bir proje üzerinde çalışırken, kodu oluşturan kişi ile değişken adlarını açıkça işaretlemek ve etiketlemek yararlı olabilir, böylece kodun orijinal yaratıcısı işbirlikçi hata düzeltmesi için hızlı bir şekilde tanımlanabilir.
// 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
}
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Ayrıca, bu numaralandırma şekli minyatürden sonra çok daha hızlıdır. Normal adlandırılmış özelliklerde, tarayıcının özelliğin nesnenin neresinde olduğunu aramak için hashmaps kullanması gerekir. JIT derleyicileri bu konumu nesnede akıllı bir şekilde önbelleğe alsa da, nesneden daha düşük bir özelliği silme gibi özel durumlar nedeniyle hala muazzam bir yük var.
Ancak, sürekli seyrek olmayan tamsayı dizinli PACKED_ELEMENTS dizileriyle, dahili dizideki değerin dizini zaten belirtildiğinden tarayıcı bu ek yükün çoğunu atlayabilir. Evet, ECMAScript standardına göre, tüm özelliklerin dize olarak ele alınması gerekir. Bununla birlikte, tüm tarayıcıların dizilerdeki sayısal dizinler için özel optimizasyonları olduğundan, ECMAScript standardının bu yönü performans konusunda çok yanıltıcıdır.
/// Hashmaps are slow, even with JIT juice
var ref = {};
ref.count = 10;
ref.value = "foobar";
Yukarıdaki kodu aşağıdaki kodla karşılaştırın.
/// 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";
Bir numaralandırma sıradan nesneleri ile kod çok daha uzun gibi görünüyor, ama görünüm aldatıcı olabilir. Destansı Closure Compiler kullanırken kaynak kodu boyutunun çıktı boyutuyla orantılı olmadığını hatırlamak önemlidir. Gözlemek.
/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};
Numaralandırma olmadan küçültülmüş kod yukarıda ve numaralandırmalı küçültülmüş kod aşağıdadır.
/// Arrays, however, are always lightning fast
var a=[10,"foobar"];
Yukarıdaki örnek, üstün performansa ek olarak, numaralandırılmış kodun daha küçük boyutta küçültülmüş bir dosya boyutu ile sonuçlandığını göstermektedir.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwvvv
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Ayrıca, üstteki kişisel kiraz, Javascript modunda CodeMirror metin editörü ile birlikte bu numaralandırma formunu kullanıyor . CodeMirror'ın Javascript sözdizimi vurgulama modu, geçerli kapsamdaki yerel değişkenleri vurgular. Bu şekilde, değişken adını doğru yazdığınızda anında bilirsiniz, çünkü değişken adı daha öncevar
anahtar , değişken adı özel bir renge döner (varsayılan olarak siyan). CodeMirror kullanmasanız bile, en azından tarayıcı yardımcı olur[variable name] is not defined
yanlış numaralandırma adlarıyla kod yürütülürken kural dışı durum. Ayrıca, JSLint ve Closure Compiler gibi JavaScript araçları, bir numaralandırma değişkeni adına yanlış yazdığınızı size söyleme konusunda çok gürültülüdür. CodeMirror, tarayıcı ve çeşitli Javascript araçları, bu numaralandırmada hata ayıklamayı çok basit ve gerçekten kolay hale getirir.
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
}
Yukarıdaki snippet'te, var olmadığı için bir hata ile uyarıldınız ENUM_COLORENUM_DNE
.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwvvv
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Bu numaralandırma yönteminin gerçekten sadece küçültülmüş kod boyutu için değil, aynı zamanda performans, hata ayıklama ve işbirliği için de en iyi yol olduğunu söylemek güvenli olduğunu düşünüyorum.
Yararlı bir soru okuduktan sonra, yazarın soru kutusuna sol üst yukarı oku tıklayarak yazılarına zaman ayırdığı için teşekkür ederim. Her yanıt kutusunda bu yukarı oklardan biri bulunur.
0
Numaralandırma numarası olarak kullanmayın . Ayarlanmamış bir şey için kullanılmadığı sürece. JS, kullanımı ile karşılaştırıldığındafalse || undefined || null || 0 || "" || '' || NaN
hepsine aynı değer olarak davranır==
.