サーチ…


備考

コンピュータプログラミングでは、列挙型(列挙型または列挙型とも呼ばれます)は、その型の要素、メンバーまたは列挙子と呼ばれる一連の名前付き値からなるデータ型です。列挙子名は、通常、言語の定数として動作する識別子です。列挙型を持つと宣言された変数には、列挙子のいずれかを値として割り当てることができます。

Wikipedia:列挙型

JavaScriptは弱く型付けされ、変数は事前に型で宣言されておらず、ネイティブなenumデータ型をもたないここで提供される例には、列挙子、代替案、および可能性のあるトレードオフをシミュレートするさまざまな方法が含まれている場合があります。

Object.freeze()を使用した列挙型の定義

5.1

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の記事のシンボルは、この新しいプリミティブ型をより詳しくカバーしています。

自動列挙値

5.1

この例では、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;
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow