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ść.
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 ()
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
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;
}