Szukaj…


Uwagi

W programowaniu komputerowym typ wyliczeniowy (zwany także wyliczeniem lub wyliczeniem [..]) to typ danych składający się z zestawu nazwanych wartości zwanych elementami, elementami lub modułami wyliczającymi tego typu. Nazwy modułu wyliczającego są zwykle identyfikatorami, które zachowują się jak stałe w języku. Zmienna, która została zadeklarowana jako posiadająca typ wyliczeniowy, można przypisać dowolnemu z wyliczających jako wartość.

Wikipedia: typ wyliczony

JavaScript jest słabo wpisany, zmienne nie są wcześniej zadeklarowane z typem i nie ma rodzimego typu danych enum . Przykłady podane tutaj mogą obejmować różne sposoby symulacji liczników, alternatywy i możliwe kompromisy.

Definicja wyliczenia za pomocą Object.freeze ()

5.1

JavaScript nie obsługuje bezpośrednio modułów wyliczających, ale funkcjonalność wyliczenia można naśladować.

// 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");
}

Powyższą definicję wyliczenia można również napisać w następujący sposób:

var TestEnum = { One: 1, Two: 2, Three: 3 }
Object.freeze(TestEnum);

Następnie możesz zdefiniować zmienną i wydrukować jak poprzednio.

Alternatywna definicja

Metoda Object.freeze() jest dostępna od wersji 5.1. W przypadku starszych wersji możesz użyć następującego kodu (pamiętaj, że działa również w wersji 5.1 i nowszych):

var ColorsEnum = {
    WHITE: 0,
    GRAY: 1,
    BLACK: 2
}
// Define a variable with a value from the enum
var currentColor = ColorsEnum.GRAY;

Drukowanie zmiennej wyliczeniowej

Po zdefiniowaniu wyliczenia przy użyciu dowolnego z powyższych sposobów i ustawieniu zmiennej można wydrukować zarówno wartość zmiennej, jak i odpowiednią nazwę z wyliczenia wartości. Oto przykład:

// 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"
   } 
}

Implementowanie wyliczeń za pomocą symboli

Ponieważ ES6 wprowadził Symbole , które są zarówno unikatowymi, jak i niezmiennymi wartościami pierwotnymi, które mogą być użyte jako klucz właściwości Object , zamiast używać łańcuchów jako możliwych wartości dla wyliczenia, możliwe jest użycie symboli.

// 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

Artykuł Symbole w ECMAScript 6 szczegółowo omawia ten nowy typ prymitywny.

Wartość automatycznego wyliczenia

5.1

W tym przykładzie pokazano, jak automatycznie przypisać wartość do każdego wpisu na liście enum. Zapobiegnie to przypadkowemu, aby dwa wyliczenia miały tę samą wartość. UWAGA: Obsługa przeglądarki 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow