𝗣𝗹𝗮𝗶𝗻𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝗡𝗮𝗺𝗲𝘀
問題を直視しましょう:ファイルサイズ。ここに記載されている他のすべての回答は、コードを極端に膨らませています。可能な限り最高のパフォーマンス、コードの可読性、大規模なプロジェクト管理、多くのコードエディターでのシンタックスヒント、および縮小によるコードサイズの縮小のために、これが列挙を行う正しい方法であることを示します。アンダースコア表記変数です。
wvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
上記のチャートと以下の例に示されているように、開始するための5つの簡単な手順を次に示します。
- 列挙グループの名前を決定します。列挙の目的または少なくとも列挙のエントリを説明できる名詞を考えてください。たとえば、ユーザーが選択可能な色を表す列挙体のグループは、COLORSよりもCOLORCHOICESという名前にすることができます。
- グループ内の列挙が相互に排他的であるか独立しているかを決定します。相互に排他的な場合は、列挙された各変数名をで始めます
ENUM_
。独立または並べて使用する場合は、を使用しますINDEX_
。
- エントリごとに、名前が
ENUM_
またはINDEX_
で始まる新しいローカル変数を作成し、次にグループの名前、アンダースコア、プロパティの一意のわかりやすい名前を作成します
- 追加
ENUMLENGTH_
、ENUMLEN_
、INDEXLENGTH_
、またはINDEXLEN_
(かどうLEN_
かLENGTH_
個人的な好みですが)一番最後に変数を列挙しました。列挙型に追加のエントリを追加してこの値をインクリメントしてもコードが破損しないように、コードでは可能な限りこの変数を使用する必要があります。
- それぞれの連続した列挙型変数に値1を与えるより最後よりも、0から始まるそこ発言があることこのページでコメントしている
0
ので、列挙値として使用すべきではないが0 == null
、0 == false
、0 == ""
、および他のJSの狂気。この問題を回避し、同時にパフォーマンスを向上===
させるために、常に使用し、(ex )==
を除いてコードに表示しないようにしてください。私が長年使用してきた中で、列挙値として0を使用することに問題があったことは一度もありません。それでもきしむ場合は、多くの場合、パフォーマンスを低下させることなく、列挙で(列挙ではなく)開始値として使用できます。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
}
これが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 wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvvwvvw wvvwwwwwwvvvw wvwwwww
𝗘𝘅𝘁𝗲𝗻𝗱𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀𝗪𝗶𝘁𝗵𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
さらに、この列挙の構文により、以下に示すように、明確で簡潔なクラス拡張が可能になります。クラスを拡張するには、増分する番号を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バイト)
これは他のソリューションよりも実用的でないと言う人もいます。それは、大量のスペースを浪費し、書くのに長い時間がかかり、砂糖の構文で覆われていません。それらの人々が彼らのコードを縮小しないならば、それらは正しいでしょう。しかし、合理的な人が最終製品に非縮小コードを残すことはありません。この縮小のために、Closure Compilerは私がまだ見つけていない最高のものです。オンラインアクセスはここにあります。クロージャコンパイラは、この列挙データをすべて取得してインライン化できるため、Javascriptを非常に小さくして、非常に高速に実行できます。したがって、Closure Compilerで縮小します。観察する。
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvvwvvw wvvwwwwwwvvvw wvwwwww
クロージャーコンパイラーは、他のJavascriptミニファイアの能力をはるかに超える推論を介して、かなり驚くべき最適化を実行できます。Closure Compilerは、固定値に設定されたプリミティブ変数をインライン化できます。Closure Compilerは、これらのインライン化された値に基づいて推論を行い、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バイト)
Closure Compilerは、よりスマートにコーディングしてコードを適切に整理することで報酬を提供します。なぜなら、多くの縮小版では整理されたコードをより大きな縮小ファイルサイズで罰しますが、Closure Compilerはすべてのクリーンさと健全性をふるいにかけて、トリックを使用すればさらに小さなファイルサイズを出力できます。変数名の列挙のように。それが、この1つの心の中でのコーディングの聖杯です。小さなサイズでコードを支援し、より良いプログラミングの習慣を訓練することで心を支援するツールです。
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvvwvvw wvvwwwwwwvvvw wvwwwww
𝗦𝗺𝗮𝗹𝗹𝗲𝗿𝗖𝗼𝗱𝗲𝗦𝗶𝘇𝗲
ここで、これらの列挙を使用しない場合の同等のファイルの大きさを見てみましょう。
列挙型を使用しないソース(長さ:1,973バイト(列挙型コードよりも477バイト短い!))
列挙型を使用しないで縮小(長さ:843バイト(列挙型コードよりも 238バイト長い))
ご覧のように、列挙を使用しないと、ソースコードは短くなりますが、縮小されたコードが大きくなります。あなたのことは知りません。しかし、ソースコードを最終製品に組み込まないことは確かです。したがって、この形式の列挙は、縮小されたファイルサイズが小さくなるという点ではるかに優れています。
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvvwvvw wvvwwwwwwvvvw wvwwwww
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲🤝𝗕𝘂𝗴𝗙𝗶𝘅𝗶𝗻𝗴
この形式の列挙のもう1つの利点は、コードサイズを縮小することなく、大規模プロジェクトを簡単に管理できることです。他の多くの人がいる大規模なプロジェクトで作業する場合、コードの作成者を明示して変数名にラベルを付けてラベルを付けると、共同でバグを修正するためにコードの元の作成者をすばやく特定できるため便利です。
// 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";
列挙型のコードは、通常のオブジェクトのコードよりもはるかに長いように見えるかもしれませんが、見た目が間違っている可能性があります。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"];
上記の例は、優れたパフォーマンスに加えて、列挙されたコードにより縮小されたファイルサイズが小さくなることを示しています。
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvvwvvw wvvwwwwwwvvvw wvwwwww
𝗘𝗮𝘀𝘆𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
さらに、一番上のこの個人のチェリーは、 JavaScriptモードでCodeMirrorテキストエディターと共にこの形式の列挙を使用しています。CodeMirrorのJavaScript構文強調表示モードは、現在のスコープ内のローカル変数を強調表示します。これにより、変数名を正しく入力したことがすぐにわかります。変数名が以前にvar
キーワードで宣言されていた場合、変数名は特別な色(デフォルトではシアン)になるためです。CodeMirrorを使用しない場合でも、少なくともブラウザーは有用な[variable name] is not defined
列挙名を誤って入力したコードを実行すると例外が発生します。また、JSLintやClosure CompilerなどのJavaScriptツールは、列挙型の変数名を誤って入力したときに通知することについて非常に騒々しいです。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 wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvvwvvw wvvwwwwwwvvvw wvwwwww
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻☑
この列挙の方法論は、コードサイズの縮小だけでなく、パフォーマンス、デバッグ、およびコラボレーションにも最適な方法であると言っても差し支えないと思います。
役立つ質問を読んだ後、質問ボックスの左上の上矢印をクリックして、執筆に時間を費やしてくれた作者に感謝します。各回答ボックスにも、これらの上向き矢印の1つがあります。
0
列挙番号として使用しないでください。設定されていないものに使用しない限り。JSはfalse || undefined || null || 0 || "" || '' || NaN
、を使用して比較すると、すべて同じ値として扱います==
。