サーチ…
備考
コンピュータプログラミングでは、列挙型(列挙型または列挙型とも呼ばれます)は、その型の要素、メンバーまたは列挙子と呼ばれる一連の名前付き値からなるデータ型です。列挙子名は、通常、言語の定数として動作する識別子です。列挙型を持つと宣言された変数には、列挙子のいずれかを値として割り当てることができます。
JavaScriptは弱く型付けされ、変数は事前に型で宣言されておらず、ネイティブなenum
データ型をもたないここで提供される例には、列挙子、代替案、および可能性のあるトレードオフをシミュレートするさまざまな方法が含まれている場合があります。
Object.freeze()を使用した列挙型の定義
JavaScriptは列挙子を直接サポートしていませんが、列挙型の機能は模倣できます。
// Prevent the enum from being changed
const TestEnum = Object.freeze({
One:1,
Two:2,
Three:3
});
// Define a variable with a value from the enum
var x = TestEnum.Two;
// Prints a value according to the variable's enum value
switch(x) {
case TestEnum.One:
console.log("111");
break;
case TestEnum.Two:
console.log("222");
}
上記の列挙型の定義は、次のように書くこともできます。
var TestEnum = { One: 1, Two: 2, Three: 3 }
Object.freeze(TestEnum);
その後、以前と同様に変数を定義して印刷することができます。
代替定義
Object.freeze()
メソッドは、バージョン5.1以降で使用できます。古いバージョンの場合は、次のコードを使用できます(バージョン5.1以降でも機能します)。
var ColorsEnum = {
WHITE: 0,
GRAY: 1,
BLACK: 2
}
// Define a variable with a value from the enum
var currentColor = ColorsEnum.GRAY;
enum変数の出力
上記の方法のいずれかを使用して列挙型を定義し、変数を設定した後、変数の値とその列挙の値に対応する名前の両方を出力できます。ここに例があります:
// Define the enum
var ColorsEnum = { WHITE: 0, GRAY: 1, BLACK: 2 }
Object.freeze(ColorsEnum);
// Define the variable and assign a value
var color = ColorsEnum.BLACK;
if(color == ColorsEnum.BLACK) {
console.log(color); // This will print "2"
var ce = ColorsEnum;
for (var name in ce) {
if (ce[name] == ce.BLACK)
console.log(name); // This will print "BLACK"
}
}
シンボルを使用した列挙型の実装
ES6では、Enumの可能な値として文字列を使用するのではなく、 Object
プロパティのキーとして使用できる固有の不変のプリミティブ値であるSymbolsが導入されたため、シンボルを使用することができます。
// Simple symbol
const newSymbol = Symbol();
typeof newSymbol === 'symbol' // true
// A symbol with a label
const anotherSymbol = Symbol("label");
// Each symbol is unique
const yetAnotherSymbol = Symbol("label");
yetAnotherSymbol === anotherSymbol; // false
const Regnum_Animale = Symbol();
const Regnum_Vegetabile = Symbol();
const Regnum_Lapideum = Symbol();
function describe(kingdom) {
switch(kingdom) {
case Regnum_Animale:
return "Animal kingdom";
case Regnum_Vegetabile:
return "Vegetable kingdom";
case Regnum_Lapideum:
return "Mineral kingdom";
}
}
describe(Regnum_Vegetabile);
// Vegetable kingdom
ECMAScript 6の記事のシンボルは、この新しいプリミティブ型をより詳しくカバーしています。
自動列挙値
この例では、enumリストの各エントリに値を自動的に割り当てる方法を示します。これにより、2つの列挙型が誤って同じ値を持つことを防ぎます。注: Object.freezeブラウザのサポート
var testEnum = function() {
// Initializes the enumerations
var enumList = [
"One",
"Two",
"Three"
];
enumObj = {};
enumList.forEach((item, index)=>enumObj[item] = index + 1);
// Do not allow the object to be changed
Object.freeze(enumObj);
return enumObj;
}();
console.log(testEnum.One); // 1 will be logged
var x = testEnum.Two;
switch(x) {
case testEnum.One:
console.log("111");
break;
case testEnum.Two:
console.log("222"); // 222 will be logged
break;
}