Тип enum в JavaScript
Тип enum или по-другому перечисление - это особый тип данных, который позволяет задавать некий список взаимосвязанных констант. Переменные этого типа могут принимать значения только из заданного в перечислении набора. Это свойство перечислений делает их удобным инструментом для реализации списка связанных значений.
Но в JavaScript на текущий момент нет нативной (родной) реализации перечислений. Поэтому давайте посмотрим как мы можем реализовать перечисления на JavaScript самостоятельно.
Начнем с простого:
// задаем объект перечисления
const Colors = { RED: 'red', GREEN: 'green', BLUE: 'blue' };
// задаем некоторое перечисление для тестирования
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 {object} объект со значениями перечисления
*/
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 Colors = Enum({ RED: 'red', GREEN: 'green', BLUE: 'blue' });
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'; // не меняет значение в перечислении
Как видите новая реализация лучше предыдущей и включает более строгое сравнение типов, которое и требуется от перечислений.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.