Перейти к содержимому

Enum js что это

  • автор:

Enum js что это

Тип enum или перечисление позволяет определить набор именнованных констант, которые описывают определенные состояния.

Для определения перечисления применяется ключевое слово enum . Например, объявим следующее перечисление:

enum Season < Winter, Spring, Summer, Autumn >;

Перечисление называется Season и имеет четыре элемента. Теперь используем перечисление:

enum Season < Winter, Spring, Summer, Autumn >; let current: Season = Season.Summer; console.log(current); // 2 current = Season.Autumn; // изменение значения

Здесь создается переменная current , которая имеет тип Season. При этом консоль браузера выведет нам число 2 — значение константы Season.Summer .

Числовые перечисления

По умолчанию константы перечисления, как в примере выше, представляют числовые значения. То есть это так называемое числовое перечисление, в котором каждой константе сопоставляется числовое значение.

Так, созданное выше в примере перечисление

enum Season < Winter, Spring, Summer, Autumn >;

фактически эквивалентно следующему:

enum Season < Winter=0, Spring=1, Summer=2, Autumn=3 >;

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

enum Season < Winter=5, Spring, Summer, Autumn >; // 5, 6, 7, 8

Либо можно каждой константе задать свое значение:

enum Season < Winter=4, Spring=8, Summer=16, Autumn=32 >; // 4, 8, 16, 32

Также мы можем получить непосредственно текстовое значение:

enum Season < Winter=0, Spring=1, Summer=2, Autumn=3 >; var current: string = Season[2]; // 2 - числовое значение Summer console.log(current); // Summer

Строковые перечисления

Кроме числовых перечислений в TypeScript есть строковые перечисления, константы которых принимают строковые значения:

enum Season < Winter = "Зима", Spring = "Весна", Summer = "Лето", Autumn = "Осень" >; var current: Season = Season.Summer; console.log(current); // Лето

Смешанные гетерогенные перечисления

Также можно определять смешанные перечисления, константы которых могут числа и строки.

enum Season < Winter = 1, Spring = "Весна", Summer = 3, Autumn = "Осень" >; var current: Season = Season.Summer; console.log(current); // 3 console.log(Season.Autumn); // Осень

Перечисления в функциях

Перечисление может выступать в качестве параметра функции.

enum DayTime < Morning, Evening >; function welcome(dayTime: DayTime) < if(dayTime === DayTime.Morning)< console.log("Доброе утро"); >else < console.log("Добрый вечер"); >> let current: DayTime = DayTime.Morning; welcome(current); // Доброе утро welcome(DayTime.Evening); // Добрый вечер

Каждая константа перечисления описывает некоторое состояние. И функция welcome() в виде параметра dayTime принимает это состояние и в зависимости от полученного значения выводит на консоль определенное значение.

Однако стоит отметить, что поскольку здесь перечисление DayTime представляет числовое перечисление, то в реальности в функцию welcome() мы можем передать числовые значения:

welcome(1); // Добрый вечер

Либо даже определить параметр функции как числовой и передавать константы числового перечисления:

enum DayTime < Morning, Evening >; function welcome(dayTime: number) < if(dayTime === DayTime.Morning)< console.log("Доброе утро"); >else < console.log("Добрый вечер"); >> let current: DayTime = DayTime.Morning; welcome(current); // Доброе утро welcome(DayTime.Evening); // Добрый вечер

Пример параметра-строкового перечисления:

enum DayTimeMessage < Morning = "Доброе утро", Evening = "Добрый вечер" >; function welcome(message: DayTimeMessage) < console.log(message); >let mes: DayTimeMessage = DayTimeMessage.Morning; welcome(mes); // Доброе утро welcome(DayTimeMessage.Evening); // Добрый вечер

При использовании строковых перечислений в отличие от числовых мы не можем передать переметру произвольную строку:

welcome("Привет, ты спишь?")

В этом случе компилятор выкатит нам ошибку при компиляции.

В то же время если параметр представляет тип string , то такому параметру можно передавать как строки, так и константы строкового перечисления:

enum DayTimeMessage < Morning = "Доброе утро", Evening = "Добрый вечер" >; function welcome(message: string) < console.log(message); >let mes: DayTimeMessage = DayTimeMessage.Morning; welcome(mes); // Доброе утро welcome(DayTimeMessage.Evening); // Добрый вечер

Перечисления: enum

Перечисления: enum

В программировании и информатике системы используют различные типизации. Системы типов позволяют грамотно обрабатывать данные, а также хранить их и выполнять разнообразные операции/расчеты. Каждый язык программирования имеет свою собственную типизацию. Рассматривая данную особенность в более широком смысле, можно выделить несколько видов данных:

  • целочисленный;
  • логический;
  • вещественный;
  • перечисляемый.

Это наиболее распространенные типы информации. Сегодня предстоит на примере C# познакомиться с типом the enum.

Определение

Тип перечисления (enumeration, enumerated type) – это тип данных, в котором множество значений представляет собой ограниченный список идентификаторов. Он определяется набором именованных констант заданного целочисленного значения.

Чтобы определить enums, необходимо воспользоваться соответствующим ключевым словом. Далее – указать имена элементов перечисления:

Перечисления: enum

По умолчанию связанные значения констант компонентов the enums рассматриваются как the int. Они начинаются с 0, увеличиваясь на единицу в соответствие с порядком текста. Разработчик способен явно указать любой другой целочисленный вид информации в качестве базового для the enum. Вот – наглядный пример соответствующей ситуации:

Перечисления: enum

Рекомендуется запомнить следующие особенности:

  1. Нельзя определять методы внутри определения enumerations.
  2. Для добавления функциональных возможностей к перечислению, потребуется создать метод расширения.
  3. Значение по умолчанию у the enum – E. Это параметр, который создан при помощи выражения (E)0, даже если 0 не имеет соответствующего компонента перечисления.

The enum используется для демонстрации выбора из набора взаимоисключающих значений или сочетаний вариантов выбора. Данные операции возможны, если рассматриваемый вид определен в качестве битовых флагов.

Битовые флаги

Enum может представлять собой комбинацию вариантов выбора. Для этого он должен быть представлен битовым флагом. В таких элементах отдельный выбор – это битовое поле.

Связанные значения элементов в enum data type реализованы в качестве степени двойки. Далее разрешается использование побитовых логических операторов | или & для комбинирования или пересечения соответственно.

Перечисления: enum

Чтобы сослаться на то, что the enum объявляет битовые поля, к нему применяется атрибут Flags. Выше – наглядный пример того, как некоторые типичные комбинации включаются в определение the enum data type.

Ограничения

System.Enum – это абстрактный базовый класс всех перечислений. Он представлен разнообразными методами, с помощью которых допустимо получать данные о the enums type и его непосредственных значениях.

Упомянутый абстрактный базовый класс может быть использован разработчиком в качестве ограничителя базового класса. Используется для того, чтобы указать, что параметр типа – это the enums type.

Любой тип перечисления будет удовлетворять ограничению struct. Данный элемент используется для ссылки на то, что type-параметр не допускает NULL-значения.

Преобразования

Любой enums поддерживает явные преобразования. Они осуществляются между enums type и его базовым целочисленным типом. Если значение приведено разработчиком к базовому виду, результатом станет связанный целочисленный параметр элемента перечисления.

Перечисления: enum

Метод the Enum.IsDefined используется для определения факта содержания в enums элемента перечисления с определенным связанным значения.

Для любого перечисления поддерживается связка «упаковка–преобразование и распаковка–преобразование» в System.Enum. Обратные операции тоже предусматриваются.

Использование и принцип работы в программировании

Enums может быть использован в:

  • объявлениях переменных;
  • формальных параметров методов, процедур и функций.

Его значения присваиваются соответствующим переменным, передаются через параметры соответствующих видов функций. Языки программирования поддерживают возможность сравнения рассматриваемого информационного типа на равенство и неравенство. Некоторые ЯП допускают прочие операции сравнения для соответствующих значений.

Результатом сравнивания enums data types в таких случаях будет определяться порядком следования используемых значений в объявлении типов. То, что встречается в объявлении раньше, выступает как «меньший» параметр. Иногда enums или некоторый его диапазон может быть использован в качестве вида индекса для массивов. В соответствующем случае для каждого значения выбранного диапазона в рамках масса поддерживается один компонент, реальный порядок следования составляющих полностью соответствует тому, как они указаны в объявлении enums type.

Реализация

The enum в процессе компиляции представляется целочисленными параметрами. Соответствующая реализация будет меняться в зависимости от языка программирования. Она может быть доступна разработчику за счет некоторых «обходных путей» (пример – принудительное преобразование параметра последовательности к целому числу) или полностью скрыто. Реже – реализация полностью управляема программистом. В соответствующем случае разработчик может явно указывать, какими числами будут координироваться все или некоторые параметры the enum.

Все варианты поддерживают положительные и отрицательные стороны:

  1. Возможность использования числовых параметров констант, формирующих перечисления, лишает смысла применения соответствующего data type. Это влечет за собой определенные ошибки.
  2. Явное управление параметрами открывает перед разработчиком некоторые дополнительные возможности.
  3. При наличии явного управления the enum, иногда удается использовать типы-перечисления для организации интерфейсов с модулями, написанными на других языках.

Реализация рассматриваемого data type позволяет экономить память. При небольшом объеме перечисления для его хранения достаточно нескольких битов. Компилятор может использовать соответствующий факт для уплотнения хранения информации в памяти.

Рациональное и экономное выделение памяти имеет особую значимость, если несколько параметров enums хранятся в одной записи. Уплотнение записей при обработке больших их количеств позволяет освободить память. Компиляторы языков программирования чаще всего лишены такой возможности.

Лучше изучить the enum и другие data types в выбранном языке программирования пользователю помогут дистанционные компьютерные курсы.

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus !

Тип enum в JavaScript

Тип enum в JavaScript

Тип enum или по-другому перечисление — это особый тип данных, который позволяет задавать некий список взаимосвязанных констант. Переменные этого типа могут принимать значения только из заданного в перечислении набора. Это свойство перечислений делает их удобным инструментом для реализации списка связанных значений.

Но в JavaScript на текущий момент нет нативной (родной) реализации перечислений. Поэтому давайте посмотрим как мы можем реализовать перечисления на JavaScript самостоятельно.

Начнем с простого:

// задаем некоторое перечисление для тестирования
const color = Colors.RED;

switch(color)
case Colors.RED:
console.log(‘Вы выбрали красный цвет’);
break;

case Colors.GREEN:
console.log(‘Вы выбрали зеленый цвет’);
break;

case Colors.BLUE:
console.log(‘Вы выбрали синий цвет’);
break;

default:
console.log(‘Неизвестный цвет’);
>

Пример выше — самая простая реализация перечисления, во многих случаях ее будет достаточно, но она далека от идеала. Так например, ничего не мешает изменить значение «константы» перечисления на какое-либо другое:

Colors.RED = ‘что то непонятное’ // в перечислении новое значение

Поэтому более правильная реализации перечислений в JavaScript будет иметь следующий вид:

/**
*
* @param obj объект со значениями перечисления
*/
function Enum(obj)
// итоговый объект
const newObj = <>;

// проходимся по каждому свойству переданного в функцию объекта
for( const prop in obj )
// проверяем наличие собственного свойства у объекта
if (obj.hasOwnProperty(prop))

// помещаем в новый объект специальный примитивный тип JavaScript Symbol
newObj[prop] = Symbol(obj[prop]);
>
>

// делаем объект неизменяемым (свойства объекта нельзя будет изменить динамически)
return Object.freeze(newObj);
>

Пример с новой реализацией:

const color = Colors.RED;

console.log(‘color === Colors.RED: ‘, color === Colors.RED) // true
console.log(‘\’red\’ === Colors.RED: ‘, ‘red’ === Colors.RED) // false — строка не равна значению перечисления.
console.log(‘color === Colors.GREEN: ‘, color === Colors.GREEN) // false

Colors.RED = ‘red’; // не меняет значение в перечислении

Как видите новая реализация лучше предыдущей и включает более строгое сравнение типов, которое и требуется от перечислений.

Создано 24.11.2020 14:00:00

  • Михаил Русаков
  • Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    1. Кнопка:
      Она выглядит вот так:
    2. Текстовая ссылка:
      Она выглядит вот так: Как создать свой сайт
    3. BB-код ссылки для форумов (например, можете поставить её в подписи):

    Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2024 Русаков Михаил Юрьевич. Все права защищены.

    TypeScript: Перечисления (Enums)

    В этом уроке мы познакомимся с перечислением. Такая конструкция языка позволяет создать набор имен, а затем обращаться к ним.

    Использование перечислений

    Перечисления используют вместо строк для постоянных значений:

    enum OrderStatus < Created, Paid, Shipped, Delivered, >const order = < items: 3, status: OrderStatus.Created, >; 

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

    • Направления движения
    • Стороны света
    • Дни недели
    • Месяцы
    enum CardinalDirection < North, South, East, West, >const direction = CardinalDirection.North; 

    Перечисление — это и значение, и тип. Его можно указывать как тип в параметрах функции:

    setStatus(status: OrderStatus) 

    Также перечисления после компиляции превращаются в JavaScript-объект, в котором каждому значению соответствует свойство. У этого свойства есть тип number и начинается он с 0 :

    const status = OrderStatus.Created; console.log(status); // 0 

    Это позволяет в дальнейшем удобно использовать стандартные методы — например, Object.keys и Object.values :

    const statuses = Object.keys(OrderStatus); console.log(statuses); // ['0', '1', '2', '3', 'Created', 'Paid', 'Shipped', 'Delivered'] 

    Среди ключей мы видим числа ‘0’, ‘1’, ‘2’, ‘3’ . Компилятор создает такие числовые ключи автоматически, а созданный объект выглядит так:

    console.log(OrderStatus); // => // < // '0': 'Created', // '1': 'Paid', // '2': 'Shipped', // '3': 'Delivered', // 'Created': 0, // 'Paid': 1, // 'Shipped': 2, // 'Delivered': 3 // >

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

    enum OrderStatus < Created = '0', Paid = '1', Shipped = '2', Delivered = '3', >const statuses = Object.keys(OrderStatus); console.log(statuses); // ['Created', 'Paid', 'Shipped', 'Delivered'] console.log(OrderStatus); // => // 'Created': '0', // 'Paid': '1', // 'Shipped': '2', // 'Delivered': '3' // > 

    Выводы

    В этом уроке мы узнали, для чего и как используется перечисление. Также мы разобрали, что его можно указывать как тип в параметрах функции.

    Задание

    1. Реализуйте перечисление ModalStatus с двумя значениями: Opened и Closed
    2. Реализуйте функцию buildModal() . Он возвращает объект, который описывает модальное окно. Параметры функции:
    • Текст, который должен быть внутри окна после инициализации
    • Статус, с которым надо создать объект окна

    Функция возвращает объект с двумя полями: text (здесь хранится переданный текст) и status (здесь хранится переданный статус)

    const modal = buildModal('hexlet forever', ModalStatus.Opened); //

    Упражнение не проходит проверку — что делать? ��

    Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

    В моей среде код работает, а здесь нет ��

    Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

    Мой код отличается от решения учителя ��

    Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

    В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

    Прочитал урок — ничего не понятно ��

    Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

    Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

    Полезное

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *