Ricerca…


Osservazioni

Nella programmazione per computer, un tipo enumerato (chiamato anche enumerazione o enum [..]) è un tipo di dati costituito da un insieme di valori denominati chiamati elementi, membri o enumeratori del tipo. I nomi degli enumeratori sono solitamente identificatori che si comportano come costanti nella lingua. Una variabile che è stata dichiarata con un tipo enumerato può essere assegnata a uno qualsiasi degli enumeratori come valore.

Wikipedia: tipo enumerato

JavaScript è debolmente tipizzato, le variabili non sono dichiarate con un tipo in anticipo e non hanno un tipo di dati enum nativo. Gli esempi forniti qui possono includere diversi modi per simulare enumeratori, alternative e possibili compromessi.

Definizione Enum con Object.freeze ()

5.1

JavaScript non supporta direttamente gli enumeratori ma la funzionalità di un enum può essere imitata.

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

La suddetta definizione di enumerazione, può anche essere scritta come segue:

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

Successivamente è possibile definire una variabile e stampare come prima.

Definizione alternativa

Il metodo Object.freeze() è disponibile dalla versione 5.1. Per le versioni precedenti, è possibile utilizzare il seguente codice (si noti che funziona anche nelle versioni 5.1 e successive):

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

Stampa di una variabile enum

Dopo aver definito un enum utilizzando uno dei metodi sopra riportati e impostando una variabile, è possibile stampare sia il valore della variabile che il nome corrispondente dall'enum per il valore. Ecco un esempio:

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

Implementazione di enum utilizzando i simboli

Poiché ES6 ha introdotto Simboli , che sono valori primitivi unici e immutabili che possono essere utilizzati come chiave di una proprietà Object , invece di utilizzare le stringhe come valori possibili per un enum, è possibile utilizzare i simboli.

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

I simboli nell'articolo ECMAScript 6 riguardano questo nuovo tipo primitivo più in dettaglio.

Valore di enumerazione automatica

5.1

Questo esempio mostra come assegnare automaticamente un valore a ciascuna voce in una lista di enum. Ciò impedirà a due enumerazioni di avere lo stesso valore per errore. NOTA: supporto 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;
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow