𝗣𝗹𝗮𝗶𝗻𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝗡𝗮𝗺𝗲𝘀
ขอให้เราตัดปัญหาขนาดไฟล์ได้โดยตรง คำตอบอื่น ๆ ที่แสดงไว้ที่นี่จะทำให้โค้ดของคุณเต็ม ฉันขอเสนอให้คุณทราบว่าเพื่อประสิทธิภาพที่ดีที่สุดความสามารถในการอ่านโค้ดการจัดการโครงการขนาดใหญ่ไวยากรณ์ที่บอกใบ้ในโปรแกรมแก้ไขโค้ดจำนวนมากและการลดขนาดรหัสโดยการทำให้เป็น minification นี่เป็นวิธีที่ถูกต้องในการระบุ
wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwv
ดังที่แสดงในแผนภูมิด้านบนและตัวอย่างด้านล่างนี่คือห้าขั้นตอนง่าย ๆ ในการเริ่มต้น:
- กำหนดชื่อสำหรับกลุ่มการแจงนับ คิดว่าเป็นคำนามที่สามารถอธิบายวัตถุประสงค์ของการแจงนับหรืออย่างน้อยรายการในการแจงนับ ตัวอย่างเช่นกลุ่มของการแจกแจงที่แสดงถึงสีที่ผู้ใช้สามารถเลือกได้อาจมีชื่อว่า COLORCHOICES ได้ดีกว่า COLORS
- ตัดสินใจว่าการแจกแจงในกลุ่มเป็นแบบเอกสิทธิ์เฉพาะบุคคลหรือเป็นอิสระ
ENUM_
ถ้าร่วมกันผูกขาดเริ่มต้นในแต่ละชื่อตัวแปรแจกแจงด้วย INDEX_
หากอิสระหรือด้านข้างโดยใช้
- สำหรับแต่ละรายการสร้างตัวแปรโลคัลใหม่ที่ชื่อขึ้นต้นด้วย
ENUM_
หรือINDEX_
จากนั้นชื่อของกลุ่มจากนั้นขีดล่างจากนั้นเป็นชื่อที่จำง่ายเฉพาะสำหรับคุณสมบัติ
- เพิ่ม
ENUMLENGTH_
, ENUMLEN_
, INDEXLENGTH_
หรือINDEXLEN_
(ไม่ว่าLEN_
หรือLENGTH_
เป็นความชอบส่วนบุคคล) ตัวแปรที่ปลายสุดแจกแจง คุณควรใช้ตัวแปรนี้เมื่อใดก็ตามที่เป็นไปได้ในรหัสของคุณเพื่อให้แน่ใจว่าการเพิ่มรายการพิเศษในการแจงนับและการเพิ่มค่านี้จะไม่ทำให้โค้ดของคุณเสียหาย
- ให้แต่ละตัวแปรนับเนื่องหนึ่งค่ามากขึ้นกว่าที่ผ่านมาเริ่มต้นที่ 0 มีความคิดเห็นเกี่ยวกับหน้านี้ที่บอกว่ามี
0
ไม่ควรใช้เป็นค่าแจกแจงเพราะ0 == null
, 0 == false
, 0 == ""
และอื่น ๆ ที่ JS ความบ้าคลั่ง ฉันส่งให้คุณเพื่อหลีกเลี่ยงปัญหานี้และเพิ่มประสิทธิภาพในเวลาเดียวกันให้ใช้===
และไม่ให้==
ปรากฏในโค้ดของคุณยกเว้นด้วยtypeof
(เช่น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
ตามนั้น มันอาจเป็นเรื่องยากและ buggy เพื่อเพิ่มรายการใหม่ในระบบการแจงนับอื่น ๆ
เว็
𝗘𝘅𝘁𝗲𝗻𝗱𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀𝗪𝗶𝘁𝗵𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
นอกจากนี้ไวยากรณ์ของการแจกแจงนี้ช่วยให้การขยายคลาสที่ชัดเจนและกระชับดังที่เห็นด้านล่าง ในการขยายคลาสให้เพิ่มจำนวนที่เพิ่มขึ้นใน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);
(ความยาว: 2,450 ไบต์)
บางคนอาจบอกว่านี่เป็นวิธีการที่น้อยกว่าวิธีแก้ปัญหาอื่น ๆ : มันช่วยลดพื้นที่ว่างได้มันใช้เวลานานในการเขียนและมันไม่ได้เคลือบด้วยน้ำตาล คนเหล่านั้นจะถูกต้องหากพวกเขาไม่ย่อหย่อนรหัสของพวกเขา อย่างไรก็ตามไม่มีบุคคลที่เหมาะสมจะทิ้งรหัสที่ไม่ได้ระบุไว้ในผลิตภัณฑ์สุดท้าย สำหรับการลดขนาดนี้ตัวรวบรวมการปิดเป็นสิ่งที่ดีที่สุดที่ฉันยังไม่พบ การเข้าถึงออนไลน์สามารถพบได้ที่นี่ ตัวรวบรวมการปิดสามารถใช้ข้อมูลการแจงนับทั้งหมดและอินไลน์ทำให้ Javascript ของคุณมีขนาดเล็กมากและทำงานได้อย่างรวดเร็วเป็นพิเศษ ดังนั้นลดขนาดด้วยคอมไพเลอร์ปิด สังเกต.
เว็
ผู้เรียบเรียงการปิดสามารถทำการปรับแต่งที่น่าเหลือเชื่อผ่านการอนุมานที่เกินกว่าขีดความสามารถของเครื่องบดย่อย Javascript อื่น ๆ การปิดคอมไพเลอร์สามารถตั้งค่าตัวแปรดั้งเดิมแบบอินไลน์ให้เป็นค่าคงที่ ผู้รวบรวมการคอมไพล์ยังสามารถทำการอนุมานโดยอิงตามค่า inlined เหล่านี้และกำจัดการบล็อกที่ไม่ได้ใช้ในคำสั่ง 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 ไบต์)
การปิดคอมไพเลอร์ให้รางวัลคุณสำหรับการเข้ารหัสอย่างชาญฉลาดและการจัดระเบียบโค้ดของคุณได้ดีเพราะในขณะที่ตัวแปลงจำนวนมากลงโทษรหัสที่จัดระเบียบด้วยขนาดไฟล์ที่เล็กกว่านั้นตัวปิดการคอมไพล์สามารถกรอง เช่นการระบุชื่อตัวแปร ในใจนี้คือจอกศักดิ์สิทธิ์ของการเข้ารหัส: เครื่องมือที่ช่วยให้โค้ดของคุณมีขนาดเล็กลงและช่วยให้จิตใจของคุณโดยฝึกนิสัยการเขียนโปรแกรมที่ดีขึ้น
เว็
𝗦𝗺𝗮𝗹𝗹𝗲𝗿𝗖𝗼𝗱𝗲𝗦𝗶𝘇𝗲
ตอนนี้ให้เราดูว่าไฟล์ที่เทียบเท่าจะมีขนาดใหญ่เท่าใดหากไม่มีตัวระบุใด ๆ เหล่านี้
แหล่งที่มาโดยไม่ใช้การแจกแจง (ความยาว: 1,973 ไบต์ (สั้นกว่ารหัสที่ระบุ! 477 ไบต์))
ย่อโดยไม่ใช้การแจกแจง (ความยาว: 843 ไบต์ ( ยาวกว่ารหัสการนับ 238 ไบต์))
เท่าที่เห็นโดยไม่มีการแจกแจงรหัสแหล่งที่มาจะสั้นลงในราคาของรหัส minified ที่มีขนาดใหญ่กว่า ฉันไม่รู้เกี่ยวกับคุณ แต่ฉันรู้แน่นอนว่าฉันไม่ได้รวมซอร์สโค้ดไว้ในผลิตภัณฑ์สุดท้าย ดังนั้นรูปแบบของการแจกแจงนี้จึงเป็นสิ่งที่ไกลเกินกว่าที่จะส่งผลให้มีขนาดไฟล์ที่เล็กลง
เว็
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲🤝𝗕𝘂𝗴𝗙𝗶𝘅𝗶𝗻𝗴
ข้อดีอีกประการของการแจงนับในรูปแบบนี้ก็คือมันสามารถใช้ในการจัดการโครงการขนาดใหญ่ได้อย่างง่ายดายโดยไม่ลดขนาดรหัสที่ย่อเล็กสุด เมื่อทำงานในโครงการขนาดใหญ่ที่มีผู้คนจำนวนมากอาจเป็นประโยชน์ในการทำเครื่องหมายและป้ายชื่อตัวแปรอย่างชัดเจนว่าใครเป็นผู้สร้างรหัสเพื่อให้ผู้สร้างรหัสดั้งเดิมสามารถระบุได้อย่างรวดเร็วสำหรับการแก้ไขข้อบกพร่องร่วมกัน
// 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 จะเก็บตำแหน่งนี้ไว้บนวัตถุอย่างชาญฉลาด แต่ก็ยังมีค่าใช้จ่ายสูงมากเนื่องจากมีกรณีพิเศษเช่นการลบคุณสมบัติที่ต่ำกว่าจากวัตถุ
แต่ด้วยarrayed 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";
หนึ่งอาจคัดค้านรหัสที่มีการแจกแจงดูเหมือนจะนานกว่ารหัสที่มีวัตถุธรรมดา แต่รูปลักษณ์ที่สามารถหลอกลวง สิ่งสำคัญคือต้องจำไว้ว่าขนาดซอร์สโค้ดไม่ได้เป็นสัดส่วนกับขนาดเอาต์พุตเมื่อใช้ epic Closure Compiler สังเกต.
/// Hashmaps are slow, even with JIT juice
var a={count:10,value:"foobar"};
โค้ดย่อส่วนที่ไม่มีการแจกแจงอยู่เหนือและโค้ดย่อที่มีการแจงนับอยู่ด้านล่าง
/// Arrays, however, are always lightning fast
var a=[10,"foobar"];
ตัวอย่างข้างต้นแสดงให้เห็นว่านอกเหนือจากการมีประสิทธิภาพที่เหนือกว่าแล้วรหัสที่แจกแจงยังส่งผลให้ขนาดไฟล์เล็กลงด้วย
เว็
𝗘𝗮𝘀𝘆𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
นอกจากนี้เชอร์รี่ส่วนบุคคลของคนนี้อยู่ด้านบนกำลังใช้รูปแบบของการแจกแจงนี้พร้อมกับโปรแกรมแก้ไขข้อความCodeMirrorในโหมด Javascript โหมดการเน้นไวยากรณ์ของ Javascript ของ CodeMirror ไฮไลต์ตัวแปรท้องถิ่นในขอบเขตปัจจุบัน ด้วยวิธีนี้คุณจะรู้ได้ทันทีเมื่อคุณพิมพ์ชื่อตัวแปรอย่างถูกต้องเพราะหากชื่อตัวแปรถูกประกาศด้วยvar
คำสำคัญก่อนหน้านี้แล้วชื่อตัวแปรจะเปลี่ยนเป็นสีพิเศษ (สีฟ้าโดยค่าเริ่มต้น) แม้ว่าคุณจะไม่ได้ใช้ CodeMirror ก็ตามเบราว์เซอร์ก็ยังมีประโยชน์[variable name] is not defined
ข้อยกเว้นเมื่อรันโค้ดด้วยชื่อการพิมพ์ผิด นอกจากนี้เครื่องมือ JavaScript เช่น JSLint และ Closure Compiler ดังมากเกี่ยวกับการบอกคุณเมื่อคุณพิมพ์ผิดในชื่อตัวแปรการแจงนับ CodeMirror, เบราว์เซอร์และเครื่องมือจาวาสคริปต์ต่าง ๆ มารวมกันทำให้การดีบักการแจงนับในรูปแบบนี้ง่ายมากและง่ายมาก
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
ไม่มีอยู่
เว็
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻☑
ฉันคิดว่ามันปลอดภัยที่จะบอกว่าวิธีการแจงนับนี้เป็นวิธีที่ดีที่สุดในการไปไม่เพียง แต่สำหรับขนาดโค้ดที่เล็ก แต่ยังสำหรับประสิทธิภาพการทำงานการดีบักและการทำงานร่วมกัน
หลังจากอ่านคำถามที่มีประโยชน์ฉันขอขอบคุณผู้เขียนที่สละเวลาในการเขียนของพวกเขาโดยคลิกลูกศรซ้ายขึ้นบนในกล่องคำถาม กล่องคำตอบแต่ละกล่องยังมีลูกศรขึ้นหนึ่งอัน
0
เป็นหมายเลขการแจงนับ นอกเสียจากว่าจะใช้สำหรับบางสิ่งที่ยังไม่ได้ตั้งค่า JS ถือว่าทั้งหมดเป็นค่าเดียวกันเมื่อเทียบกับการใช้false || undefined || null || 0 || "" || '' || NaN
==