Поиск…


замечания

В компьютерном программировании перечисляемый тип (также называемый enumeration или enum [..]) является типом данных, состоящим из набора именованных значений, называемых элементами, членами или перечислениями типа. Имена перечислений обычно являются идентификаторами, которые ведут себя как константы на языке. Переменной, объявленной как имеющей нумерованный тип, может быть присвоен любой из счетчиков в качестве значения.

Википедия: Перечислимый тип

JavaScript слабо типизирован, переменные не объявляются с типом заранее, и у него нет собственного типа данных enum . Приведенные здесь примеры могут включать различные способы имитации счетчиков, альтернатив и возможных компромиссов.

Определение 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;

Печать переменной перечисления

После определения перечисления с использованием любого из указанных способов и установки переменной вы можете напечатать как значение переменной, так и соответствующее имя из перечисления для значения. Вот пример:

// 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 были введены Символы , которые являются как уникальными, так и неизменными примитивными значениями, которые могут использоваться как ключ свойства Object , вместо того, чтобы использовать строки как возможные значения для перечисления, можно использовать символы.

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

В этом примере показано, как автоматически присваивать значение каждой записи в списке перечислений. Это предотвратит ошибочное присвоение двух перечислений. ПРИМЕЧАНИЕ. Поддержка браузера 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