Zoeken…
Opmerkingen
In computerprogrammering is een opgesomd type (ook opsommingsteken of opsomming [..]) een gegevenstype dat bestaat uit een reeks benoemde waarden die elementen, leden of opsommers van het type worden genoemd. De namen van de teller zijn meestal identifiers die zich als constanten in de taal gedragen. Aan een variabele waarvan is aangegeven dat deze een genummerd type heeft, kan elk van de opsommers worden toegewezen als een waarde.
JavaScript is zwak getypt, variabelen zijn niet gedeclareerd met een soort van tevoren en het hoeft niet een native enum
datatype. Voorbeelden die hier worden gegeven, kunnen verschillende manieren omvatten om tellers te simuleren, alternatieven en mogelijke afwegingen.
Definitie bepalen met Object.freeze ()
JavaScript biedt geen directe ondersteuning voor opsommers, maar de functionaliteit van een opsomming kan worden nagebootst.
// 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");
}
De bovenstaande opsommingdefinitie kan ook als volgt worden geschreven:
var TestEnum = { One: 1, Two: 2, Three: 3 }
Object.freeze(TestEnum);
Daarna kunt u een variabele definiëren en afdrukken zoals eerder.
Alternatieve definitie
De methode Object.freeze()
is beschikbaar sinds versie 5.1. Voor oudere versies kunt u de volgende code gebruiken (merk op dat deze ook werkt in versies 5.1 en hoger):
var ColorsEnum = {
WHITE: 0,
GRAY: 1,
BLACK: 2
}
// Define a variable with a value from the enum
var currentColor = ColorsEnum.GRAY;
Een enum-variabele afdrukken
Nadat u een opsomming op een van de bovenstaande manieren hebt gedefinieerd en een variabele hebt ingesteld, kunt u zowel de waarde van de variabele als de bijbehorende naam uit de opsomming voor de waarde afdrukken. Hier is een voorbeeld:
// 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"
}
}
Enums implementeren met symbolen
Toen ES6 symbolen introduceerde, die zowel unieke als onveranderlijke primitieve waarden zijn die kunnen worden gebruikt als de sleutel van een eigenschap Object
, in plaats van tekenreeksen als mogelijke waarden voor een opsomming te gebruiken, is het mogelijk om symbolen te gebruiken.
// 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
Het artikel Symbolen in ECMAScript 6 behandelt dit nieuwe primitieve type meer in detail.
Automatische opsommingswaarde
Dit voorbeeld laat zien hoe u automatisch een waarde kunt toewijzen aan elk item in een lijst. Dit voorkomt dat twee enums per ongeluk dezelfde waarde hebben. OPMERKING: Ondersteuning van de browser 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;
}