Какой синтаксис является предпочтительным для определения перечислений в JavaScript? Что-то вроде:
my.namespace.ColorEnum = {
RED : 0,
GREEN : 1,
BLUE : 2
}
// later on
if(currentColor == my.namespace.ColorEnum.RED) {
// whatever
}
Или есть более предпочтительная идиома?
javascript
syntax
enums
Дэвид Цитрон
источник
источник
0
в качестве номера перечисления. Если это не используется для чего-то, что не было установлено. JS рассматриваетfalse || undefined || null || 0 || "" || '' || NaN
все как одно и то же значение при сравнении с использованием==
.0 == null
возвращает falsefalse == 0
и+null == 0
(и преобразования в числа происходят иногда, когда вы этого не ожидаете), аnull == undefined
также и+undefined
естьNaN
(хотяNaN != NaN
).Ответы:
Начиная с версии 1.8.5 можно запечатать и заморозить объект, поэтому определите вышеизложенное как:
или
и вуаля! JS перечисления.
Тем не менее, это не мешает вам присвоить нежелательное значение переменной, что часто является главной целью перечислений:
Один из способов обеспечить более высокую степень безопасности типов (с помощью перечислений или иным образом) - использовать такой инструмент, как TypeScript или Flow .
Источник
Цитаты не нужны, но я сохранил их для согласованности.
источник
var DaysEnum = Object.freeze ({ monday: {}, tuesday: {}, ... });
. Вам не нужно указывать идентификатор, вы можете просто использовать пустой объект для сравнения перечислений.if (incommingEnum === DaysEnum.monday) //incommingEnum is monday
if (Object.freeze) { Object.freeze(DaysEnum); }
({ monday: {},
и т. Д. Означает, что если вы преобразуете этот объект в JSON с помощью stringify, вы получите,[{"day": {}}]
что не сработает.var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}
. Сравнение объектов, как в моем предыдущем комментарии, НАМНОГО БОЛЬШЕ, чем сравнение чисел.Это не очень хороший ответ, но я бы сказал, что он работает очень хорошо, лично
Тем не менее, поскольку значения не имеют значения (вы использовали 0, 1, 2), я бы использовал значимую строку на случай, если вы когда-нибудь захотите вывести текущее значение.
источник
Object.freeze()
. Это не позволит другому коду изменять значения перечисления. Пример:var ColorEnum = Object.freeze({RED: 0, GREEN: 1, BLUE: 2});
instanceof
проверки. НапримерColorEnum.RED instanceof ColorEnum
(возвращаетtrue
). Вы также можете разрешить экземпляр из имениColorEnum.fromName("RED") === ColorEnum.RED
(возвращаетtrue
). Каждый экземпляр имеет также.name()
и к.ordinal()
способу, и само перечисление имеетvalues()
метод , который returnd массив всех констант.ToString()
метод. Мы, разработчики JS, уже слишком зависимы от того, что «просто работает»! Также нужно уметь быстроswitch
перечислять. Сравнение строк выполняется медленнее, чем сравнение чисел, поэтому производительность будет немного хуже,switch
если вы будете использовать строки вместо целых чисел.ОБНОВИТЬ
Спасибо всем за поддержку, но я не думаю, что мой ответ ниже - лучший способ написать перечисления в JavaScript. Смотрите мой блог для более подробной информации: Перечисления в JavaScript .
Оповещение имени уже возможно:
В качестве альтернативы, вы можете создать объекты значений, чтобы вы могли получить торт и съесть его:
В JavaScript, поскольку это динамический язык, можно даже добавить значения enum в набор позже:
Помните, что поля перечисления (значение, имя и код в этом примере) не нужны для проверки идентичности и существуют только для удобства. Также имя свойства size не обязательно должно быть жестко закодировано, но также может быть установлено динамически. Итак, предположим, что вы знаете только имя для нового значения перечисления, вы все равно можете добавить его без проблем:
Конечно, это означает, что некоторые предположения больше не могут быть сделаны (например, это значение представляет правильный порядок для размера).
Помните, что в JavaScript объект похож на карту или хэш-таблицу . Набор пар имя-значение. Вы можете просматривать их или иным образом манипулировать ими, не зная о них заранее.
пример
И, кстати, если вы заинтересованы в пространствах имен, вы можете взглянуть на мое решение для простого, но мощного управления пространством имен и зависимостей для JavaScript: Пакеты JS
источник
Итог: вы не можете.
Вы можете подделать это, но вы не получите безопасность типа. Обычно это делается путем создания простого словаря строковых значений, сопоставленных с целочисленными значениями. Например:
Проблема с этим подходом? Вы можете случайно переопределить свой перечислитель или случайно иметь повторяющиеся значения перечислителя. Например:
редактировать
Абсолютно,
Object.freeze
полностью решит проблему, на которую я жаловался. Я хотел бы напомнить всем, что, когда я писал выше, наObject.freeze
самом деле не существовало.Теперь .... теперь это открывает некоторые очень интересные возможности.
Edit 2
Вот очень хорошая библиотека для создания перечислений.
http://www.2ality.com/2011/10/enums.html
Хотя это, вероятно, не подходит для каждого допустимого использования перечислений, оно идет очень далеко.
источник
var daysEnum = (function(){ var daysEnum = { monday: 1, tuesday: 2 }; return { get: function(value){ return daysEnum[value]; } } })(); daysEnum.get('monday'); // 1
Вот что мы все хотим:
Теперь вы можете создавать свои перечисления:
Делая это, можно получить доступ к константам обычным способом (YesNo.YES, Color.GREEN) и получить последовательное значение типа int (NO = 0, YES = 1; RED = 0, GREEN = 1, BLUE = 2).
Вы также можете добавить методы, используя Enum.prototype:
Редактировать - небольшое улучшение - теперь с varargs: (к сожалению, это не работает должным образом в IE: S ... тогда следует придерживаться предыдущей версии)
источник
В большинстве современных браузеров существует тип данных символьного примитива, который можно использовать для создания перечисления. Это обеспечит безопасность типа перечисления в каждое значение символа гарантируется JavaScript должен быть уникальным, то есть
Symbol() != Symbol()
. Например:Чтобы упростить отладку, вы можете добавить описание к перечисляемым значениям:
Plunker demo
На GitHub вы можете найти оболочку, которая упрощает код, необходимый для инициализации enum:
источник
Symbol
он предназначен.Object.freeze
только для людей, которые не приняли тот факт, что «monkeypatch на свой страх и риск» является социальным контрактом JS?toJSON
для класса, который использует этот подход: stackoverflow.com/questions/58499828/…𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Давайте обратимся прямо к проблеме: размер файла. Любой другой ответ, перечисленный здесь, увеличивает ваш код до крайности. Я представляю вам, что для наилучшей производительности, читабельности кода, управления крупномасштабными проектами, подсказок синтаксиса во многих редакторах кода и уменьшения размера кода путем минимизации, это правильный способ сделать перечисления: переменные подчеркивания.
wvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwvwv
Как показано в приведенной выше таблице и в примере ниже, для начала есть пять простых шагов:
ENUM_
. Если независимый или бок о бок, используйтеINDEX_
.ENUM_
илиINDEX_
, затем имя группы, затем подчеркивание, а затем уникальное понятное имя для свойства.ENUMLENGTH_
,ENUMLEN_
,INDEXLENGTH_
илиINDEXLEN_
(независимо от тогоLEN_
илиLENGTH_
это личное предпочтение) перечисленное переменной в самом конце. Вы должны использовать эту переменную везде, где это возможно, в вашем коде, чтобы гарантировать, что добавление дополнительной записи в перечисление и увеличение этого значения не нарушит ваш код.0
не следует использовать в качестве перечисленного значения , так как0 == null
,0 == false
,0 == ""
и другие JS сумасшествий. Я утверждаю, что, чтобы избежать этой проблемы и одновременно повысить производительность, всегда используйте===
и никогда не позволяйте==
появляться в вашем коде, кромеtypeof
(extypeof X == "string"
). За все годы использования===
у меня никогда не было проблем с использованием 0 в качестве значения перечисления. Если вы по-прежнему брезгливы, то1
можете использовать его как начальное значение вENUM_
перечислениях (но не вINDEX_
перечислениях) без потери производительности во многих случаях.Вот как я помню, когда использовать
INDEX_
и когда использоватьENUM_
:Однако
ENUM_
в определенных обстоятельствах может быть уместным в качестве индекса, например, при подсчете вхождений каждого элемента.Заметьте, что в приведенном выше коде действительно легко добавить новый вид питомца: вам просто нужно добавить новую запись после
ENUM_PET_RAT
и обновитьENUMLEN_PET
соответствующим образом. Может быть сложнее и глючно добавить новую запись в другие системы перечисления.wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Кроме того, этот синтаксис перечислений допускает ясное и краткое расширение классов, как показано ниже. Чтобы расширить класс, добавьте инкрементное число к
LEN_
записи родительского класса. Затем завершите подкласс своей собственнойLEN_
записью, чтобы подкласс мог быть расширен в будущем.(Длина: 2450 байт)
Некоторые могут сказать, что это менее практично, чем другие решения: оно занимает много места, требует много времени для написания и не содержит синтаксиса сахара. Эти люди были бы правы, если бы они не минимизировали свой код. Тем не менее, ни один разумный человек не оставит единый код в конечном продукте. Для этого миниатюры Closure Compiler - лучшее, что я пока не нашел. Онлайн доступ можно найти здесь . Компилятор Closure может взять все эти перечисленные данные и вставить их в строку, что делает ваш Javascript очень маленьким и быстро запускаемым. Таким образом, Minify with Closure Compiler. Обратите внимание.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw
𝗠𝗶𝗻𝗶𝗳𝘆 𝗪𝗶𝘁𝗵 𝗖𝗹𝗼𝘀𝘂𝗿𝗲 𝗖𝗼𝗺𝗽𝗶𝗹𝗲𝗿
Компилятор Closure способен выполнять некоторые довольно невероятные оптимизации с помощью умозаключений, которые намного превосходят возможности любого другого Javascript minifier. Закрытие Компилятор может встроить примитивные переменные с фиксированным значением. Закрывающий компилятор также может делать выводы на основе этих встроенных значений и исключать неиспользуемые блоки в операторах if и циклах.
(Длина: 605 байт)
Closure Compiler вознаграждает вас за правильное кодирование и хорошую организацию вашего кода, потому что, в то время как многие минифайеры наказывают организованный код большим уменьшенным размером файла, Closure Compiler может просеять всю вашу чистоту и разумность, чтобы вывести файл еще меньшего размера, если вы используете хитрости как перечисления имен переменных. В этом едином мнении есть святой Грааль кодирования: инструмент, который одновременно помогает вашему коду с меньшим уменьшенным размером и помогает вашему уму, обучая лучшим навыкам программирования.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Теперь давайте посмотрим, насколько большим будет эквивалентный файл без каких-либо перечислений.
Исходный код без использования перечислений (длина: 1973 байта (на 477 байт короче перечисляемого кода!))
Сокращен без использования перечислений (длина: 843 байта (на 238 байт длиннее перечисляемого кода ))
Как видно, без перечислений исходный код короче за счет большего уменьшенного кода. Я не знаю о тебе; но я точно знаю, что не включаю исходный код в конечный продукт. Таким образом, эта форма перечислений намного лучше, так как она приводит к меньшим уменьшенным размерам файлов.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Еще одно преимущество этой формы перечисления состоит в том, что она может использоваться для простого управления крупномасштабными проектами без ущерба для минимизированного размера кода. При работе над большим проектом с большим количеством других людей может быть полезно явно пометить и пометить имена переменных, с которыми был создан код, чтобы можно было быстро определить первоначального создателя кода для совместного исправления ошибок.
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Кроме того, эта форма перечисления также намного быстрее после минификации. В обычных именованных свойствах браузер должен использовать хеш-карты для поиска того, где находится свойство на объекте. Хотя JIT-компиляторы интеллектуально кэшируют это местоположение на объекте, все еще существуют огромные накладные расходы из-за особых случаев, таких как удаление более низкого свойства из объекта.
Но при использовании непрерывных неразреженных массивов PACKED_ELEMENTS с целочисленным индексом браузер может пропустить большую часть этих издержек, поскольку индекс значения во внутреннем массиве уже указан. Да, согласно стандарту ECMAScript все свойства должны рассматриваться как строки. Тем не менее, этот аспект стандарта ECMAScript очень вводит в заблуждение относительно производительности, поскольку все браузеры имеют специальные оптимизации для числовых индексов в массивах.
Сравните код выше с кодом ниже.
Можно возразить против кода с перечислениями, которые кажутся намного длиннее, чем код с обычными объектами, но внешний вид может быть обманчивым. Важно помнить, что размер исходного кода не пропорционален размеру вывода при использовании epic Closure Compiler. Обратите внимание.
Минимизированный код без перечислений выше, а минимизированный код с перечислениями ниже.
Приведенный выше пример демонстрирует, что в дополнение к превосходной производительности перечисляемый код также приводит к уменьшению уменьшенного размера файла.
wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Кроме того, личная вишня сверху использует эту форму перечислений вместе с текстовым редактором CodeMirror в режиме Javascript. Режим подсветки синтаксиса Javascript в CodeMirror выделяет локальные переменные в текущей области видимости. Таким образом, вы сразу узнаете, когда правильно вводите имя переменной, потому что, если имя переменной было ранее объявлено с
var
ключевым словом, тогда имя переменной приобретает особый цвет (по умолчанию голубой). Даже если вы не используете CodeMirror, то по крайней мере браузер выдает полезную[variable name] is not defined
исключение при выполнении кода с ошибочными именами перечислений. Кроме того, инструменты JavaScript, такие как JSLint и Closure Compiler, очень громко рассказывают вам, когда вы вводите неверный тип в имени переменной перечисления. CodeMirror, браузер и различные инструменты Javascript вместе делают отладку этой формы перечисления очень простой и действительно простой.В приведенном выше фрагменте вы были предупреждены об ошибке, потому
ENUM_COLORENUM_DNE
что не существует.wvwwvw wvwvwvw wvwxvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvw wvwwvw wvwvxwvw
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Я думаю, можно с уверенностью сказать, что эта методология перечисления действительно является лучшим способом не только для минимизированного размера кода, но также для производительности, отладки и совместной работы.
Прочитав полезный вопрос, я благодарю автора за то, что он потратил время на их написание, щелкнув верхнюю левую стрелку вверх в окне вопроса. Каждое поле ответа также имеет одну из этих стрелок вверх.
источник
colors.REED
доходностьundefined
), поэтому опечатки создают неуловимые загадки. YEA не различает использование перечислений в качестве индексов и идентификаторов, что приводит к запутанному коду, где все выглядит одинаково. …Я играл с этим, так как я люблю свои перечисления. знак равно
Используя,
Object.defineProperty
я думаю, я нашел несколько жизнеспособное решение.Вот jsfiddle: http://jsfiddle.net/ZV4A6/
Используя этот метод ... вы должны (в теории) иметь возможность вызывать и определять значения перечисления для любого объекта, не затрагивая другие атрибуты этого объекта.
Из-за атрибута
writable:false
это должно сделать его безопасным.Таким образом, вы должны иметь возможность создать пользовательский объект, а затем вызвать
Enum()
его. Присвоенные значения начинаются с 0 и увеличиваются на единицу.источник
return this;
в конце Enum, вы можете сделать:var EnumColors = {}.Enum('RED','BLUE','GREEN','YELLOW');
false
по умолчанию дляwritable
,enumerable
иconfigurable
. Нет необходимости переваривать значения по умолчанию.Используйте Javascript Proxies
TLDR: добавьте этот класс в свои служебные методы и используйте его во всем коде, он имитирует поведение Enum из традиционных языков программирования и фактически выдает ошибки, когда вы пытаетесь получить доступ к не существующему перечислителю или добавить / обновить перечислитель. Не нужно полагаться на
Object.freeze()
.Затем создайте перечисления, создав экземпляр класса:
Полное объяснение:
Одна очень полезная особенность Enums, которую вы получаете от традиционных языков, заключается в том, что они взрываются (выдают ошибку времени компиляции), если вы пытаетесь получить доступ к перечислителю, который не существует.
Помимо замораживания поддельной структуры enum для предотвращения случайного / злонамеренного добавления дополнительных значений, ни один из других ответов не затрагивает эту внутреннюю особенность Enums.
Как вы, вероятно, знаете, доступ к несуществующим элементам в JavaScript просто возвращает
undefined
и не взрывает ваш код. Поскольку перечислители являются предопределенными константами (т.е. днями недели), никогда не должно быть случая, когда перечислитель должен быть неопределенным.Не поймите меня неправильно, поведение JavaScript при возврате
undefined
при доступе к неопределенным свойствам на самом деле является очень мощной функцией языка, но это не та функция, которая вам нужна, когда вы пытаетесь смоделировать традиционные структуры Enum.Здесь прокси объекты сияют. Прокси были стандартизированы в языке с введением ES6 (ES2015). Вот описание из MDN:
Подобно прокси-серверу веб-сервера, прокси-серверы JavaScript способны перехватывать операции над объектами (с использованием «ловушек», называть их хуками, если хотите) и позволяют выполнять различные проверки, действия и / или манипуляции до их завершения (или в некоторых случаях вообще прекращение операций, что мы и хотим делать, если и когда мы пытаемся сослаться на перечислитель, который не существует).
Вот надуманный пример, который использует объект Proxy для имитации Enums. В этом примере перечислители являются стандартными методами HTTP (например, «GET», «POST» и т. Д.):
ASIDE: Какого черта это прокси?
Я помню, когда я впервые начал видеть слово «прокси» везде, это определенно не имело смысла для меня долгое время. Если вы сейчас, я думаю, что простой способ обобщить прокси - это думать о них как о программном обеспечении, учреждениях или даже людях, которые выступают в качестве посредников или посредников между двумя серверами, компаниями или людьми.
источник
valueOf
метод по умолчанию , указав его как метод экземпляра в классе Enum. Однако, почему вы хотите получить к нему доступ таким образом, а не просто с помощью точечной нотации?logLevelEnum[settings.get("log_level")]
? добавлениеparseOrThrow
будет просто повторением того, что ловушки прокси уже делают для вас.Это старая версия, которую я знаю, но с тех пор она была реализована через интерфейс TypeScript:
Это позволяет вам искать оба,
MyEnum.Bar
которые возвращают 1, иMyEnum[1]
которые возвращают «Bar» независимо от порядка объявления.источник
enum MyEnum { Foo, Bar, Foobar }
В ES7 вы можете сделать элегантный ENUM, опираясь на статические атрибуты:
тогда
Преимущество (использование класса вместо буквального объекта) должен иметь родительский класс ,
Enum
то все ваши Перечисления будут расширяет этот класс.источник
new ColorEnum()
не имеет абсолютно никакого смысла.Enum
имеет стандартные статические методы Enumerator на него, какgetValues()
,getNames()
,iterate()
и т.д. Если это так, вы не должны переопределять их для каждого нового видаenum
.Это решение, которое я использую.
И вы определяете свои перечисления следующим образом:
И вот как вы получаете доступ к своим перечислениям:
Я обычно использую последние 2 метода для отображения перечислений из объектов сообщений.
Некоторые преимущества этого подхода:
Некоторые недостатки:
источник
Создайте литерал объекта:
источник
const
не делает свойства объекта неизменяемыми, это только означает, что переменнаяModes
не может быть переназначена чему-либо другому. Чтобы сделать его более полным, используйтеObject.freeze()
рядомconst
.Object.freeze
. Это препятствует тому, чтобы Закрытие Компилятора встраивало объект.Если вы используете Backbone , вы можете получить полную функциональность перечисления (поиск по идентификатору, имени, пользовательским элементам) бесплатно с помощью Backbone.Collection .
источник
ваши ответы слишком сложны
источник
Я изменил решение Андре 'Fi':
Тестовое задание:
источник
Я придумал этот подход, который смоделирован после перечислений в Java. Они безопасны от типов, поэтому вы также можете выполнять
instanceof
проверки.Вы можете определить перечисления следующим образом:
Days
Теперь относится кDays
перечислению:Реализация:
источник
freeze
метода обратной совместимости? Например,if (Object.freeze) { Object.freeze(values); }
IE8 не поддерживает метод freeze ().
Источник: http://kangax.github.io/compat-table/es5/ , нажмите «Показать устаревшие браузеры?» сверху, и проверьте IE8 и зафиксируйте пересечение столбцов строк.
В моем текущем игровом проекте я использовал ниже, так как мало клиентов все еще используют IE8:
Мы также могли бы сделать:
или даже это:
Последнее, кажется, наиболее эффективно для строки, оно уменьшает вашу общую пропускную способность, если у вас есть сервер и клиент, обменивающийся этими данными.
Конечно, теперь вы обязаны убедиться, что в данных нет конфликтов (RE, EX и т. Д. Должны быть уникальными, а также 1, 2 и т. Д. Должны быть уникальными). Обратите внимание, что вы должны поддерживать их всегда для обратной совместимости.
Назначение:
Comparision:
источник
Вам не нужно следить за тем, чтобы таким образом не назначать повторяющиеся числа различным значениям перечисления. Новый объект создается и присваивается всем значениям перечисления.
источник
Вот несколько разных способов реализации перечислений TypeScript .
Самый простой способ - просто перебрать объект, добавив к нему инвертированные пары ключ-значение. Единственным недостатком является то, что вы должны вручную установить значение для каждого члена.
А вот микшин lodash для создания перечисления с использованием строки. Хотя эта версия немного сложнее, она выполняет нумерацию автоматически. Все методы lodash, используемые в этом примере, имеют обычный эквивалент JavaScript, так что вы можете легко их отключить, если хотите.
источник
Я только что опубликовал пакет NPM gen_enum, позволяющий быстро создавать структуру данных Enum в Javascript:
В этом маленьком инструменте есть одна приятная вещь: в современной среде (включая nodejs и браузеры IE 9+) возвращаемый объект Enum является неизменным.
Для получения дополнительной информации, пожалуйста, проверьте https://github.com/greenlaw110/enumjs
Обновления
Устаревший
gen_enum
пакет и объединяю функцию в пакет constjs , который предоставляет больше возможностей, включая неизменяемые объекты, десериализацию строк JSON, строковые константы, генерацию растровых изображений и т. Д. Оформление заказа https://www.npmjs.com/package/constjs Для получения дополнительной информацииЧтобы обновить ,
gen_enum
чтобыconstjs
просто изменить заявлениев
источник
Самое простое решение:
Создайте
Получить значение
Получить ключ
источник
Я создал класс Enum, который может извлекать значения и имена в O (1). Он также может генерировать массив объектов, содержащий все имена и значения.
Вы можете init'd это так:
Чтобы получить значение (как Enums в C #):
Чтобы получить имя для значения (может быть неоднозначным, если поставить одно и то же значение для разных имен):
Чтобы получить массив с каждым именем и значением в объекте:
Будет генерировать:
Вы также можете легко получить опции выбора HTML:
Который содержит:
источник
Даже если только статические методы (а не статические свойства) поддерживаются в ES2015 (см здесь также, §15.2.2.2), как ни странно , вы можете использовать ниже с Вавилонской с
es2015
предустановки:Я обнаружил, что это работает должным образом даже между модулями (например, импорт
CellState
enum из другого модуля), а также при импорте модуля с помощью Webpack.Преимущество этого метода перед большинством других ответов заключается в том, что вы можете использовать его вместе со средством проверки статического типа (например, Flow ), и вы можете утверждать, что во время разработки, используя проверку статического типа, что ваши переменные, параметры и т. Д. Имеют определенную
CellState
" enum ", а не какой-либо другой enum (который было бы невозможно отличить, если бы вы использовали общие объекты или символы).Обновить
Вышеприведенный код имеет недостаток в том, что он позволяет создавать дополнительные объекты типа
CellState
(даже если вы не можете назначить их статическим полям,CellState
так как он заморожен). Тем не менее, приведенный ниже более усовершенствованный код предлагает следующие преимущества:CellState
нельзя создавать объекты типаvalues
функция , которая возвращает все экземпляры перечисления не должны создавать возвращаемое значение в приведенном выше, ручной (и подверженной ошибкам) способом.источник
es7 way, (iterator, freeze), использование:
код:
источник
Вот как Typescript переводит это
enum
в Javascript:Сейчас же:
Сначала я был озадачен, почему
obj[1]
возвращается'Active'
, но потом понял, что его очень просто - оператор присваивания присваивает значение, а затем возвращает его:источник
Вы можете сделать что-то вроде этого
Как определено в этой библиотеке. https://github.com/webmodule/foo/blob/master/foo.js#L217
Полный пример https://gist.github.com/lnt/bb13a2fd63cdb8bce85fd62965a20026
источник
Быстрый и простой способ будет:
источник
На момент написания, октябрь 2014 года - так вот современное решение. Пишу решение в виде Node Module и включаю тест с использованием Mocha и Chai, а также underscoreJS. Вы можете легко игнорировать их и просто взять код Enum, если хотите.
Посмотрел много постов с чрезмерно запутанными библиотеками и т. Д. Решение получить поддержку enum в Javascript настолько просто, что действительно не нужно. Вот код:
Файл: enums.js
И тест, чтобы проиллюстрировать, что это дает вам:
файл: enumsSpec.js
Как видите, вы получаете фабрику Enum, вы можете получить все ключи, просто вызвав enum.keys, и вы можете сопоставить сами ключи с целочисленными константами. И вы можете повторно использовать фабрику с другими значениями и экспортировать сгенерированные Enums, используя модульный подход Node.
Еще раз, если вы обычный пользователь, или в браузере и т. Д., Просто возьмите заводскую часть кода, потенциально удалив также библиотеку подчеркивания, если вы не хотите использовать ее в своем коде.
источник
Это легко использовать, я думаю. https://stackoverflow.com/a/32245370/4365315
ОБНОВИТЬ:
Есть мои вспомогательные коды (
TypeHelper
).Показать фрагмент кода
источник