¿Cuál es la sintaxis preferida para definir enumeraciones en JavaScript? Algo como:
my.namespace.ColorEnum = {
RED : 0,
GREEN : 1,
BLUE : 2
}
// later on
if(currentColor == my.namespace.ColorEnum.RED) {
// whatever
}
¿O hay un idioma más preferible?
javascript
syntax
enums
David Citron
fuente
fuente
0
como número de enumeración. A menos que se use para algo que no se haya configurado. JS trata afalse || undefined || null || 0 || "" || '' || NaN
todos como el mismo valor en comparación con el uso==
.0 == null
devuelve falsofalse == 0
y+null == 0
(y las conversiones a números suceden a veces cuando no lo espera), mientras quenull == undefined
también, y+undefined
esNaN
(aunqueNaN != NaN
).Respuestas:
Desde 1.8.5 es posible sellar y congelar el objeto, así que defina lo anterior como:
o
¡y voilá! JS enumeraciones.
Sin embargo, esto no le impide asignar un valor no deseado a una variable, que a menudo es el objetivo principal de las enumeraciones:
Una forma de garantizar un mayor grado de seguridad de tipos (con enumeraciones o de otro tipo) es utilizar una herramienta como TypeScript o Flow .
Fuente
No se necesitan citas, pero las conservé para mantener la coherencia.
fuente
var DaysEnum = Object.freeze ({ monday: {}, tuesday: {}, ... });
. No necesita especificar una identificación, solo puede usar un objeto vacío para comparar enumeraciones.if (incommingEnum === DaysEnum.monday) //incommingEnum is monday
if (Object.freeze) { Object.freeze(DaysEnum); }
({ monday: {},
etc. significa que si convierte ese objeto a JSON a través de stringify obtendrá lo[{"day": {}}]
que no funcionará.var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}
. Comparar objetos como en mi comentario anterior es MUCHO MÁS LENTO que comparar números.Esta no es una gran respuesta, pero yo diría que funciona bien, personalmente.
Habiendo dicho eso, dado que no importa cuáles sean los valores (ha usado 0, 1, 2), usaría una cadena significativa en caso de que alguna vez quisiera generar el valor actual.
fuente
Object.freeze()
. Esto evitará que otro código cambie los valores de la enumeración. Ejemplo:var ColorEnum = Object.freeze({RED: 0, GREEN: 1, BLUE: 2});
instanceof
cheques. Por ejemploColorEnum.RED instanceof ColorEnum
(devolucionestrue
). También puede resolver una instancia de un nombreColorEnum.fromName("RED") === ColorEnum.RED
(devolucionestrue
). Cada instancia también tiene un.name()
y un.ordinal()
método, y la enumeración en sí tiene unvalues()
método que devuelve una matriz de todas las constantes.ToString()
método. ¡Los desarrolladores de JS ya somos demasiado dependientes de las cosas que "simplemente funcionan"! Además, uno debería poder rápidamenteswitch
en una enumeración. Comparar cadenas es más lento que comparar números, por lo que obtendrá unswitch
rendimiento ligeramente peor si usa cadenas en lugar de números enteros.ACTUALIZAR
Gracias por todos los votos a favor de todos, pero no creo que mi respuesta a continuación sea la mejor manera de escribir enumeraciones en JavaScript. Vea mi publicación de blog para más detalles: Enums en JavaScript .
Alertar el nombre ya es posible:
Alternativamente, puede hacer que los valores sean objetos, para que pueda tener el pastel y comérselo también:
En JavaScript, como es un lenguaje dinámico, incluso es posible agregar valores de enumeración al conjunto más adelante:
Recuerde, los campos de la enumeración (valor, nombre y código en este ejemplo) no son necesarios para la verificación de identidad y solo están allí por conveniencia. Además, el nombre de la propiedad de tamaño en sí no necesita ser codificado, sino que también se puede establecer dinámicamente. Entonces, suponiendo que solo conozca el nombre de su nuevo valor de enumeración, aún puede agregarlo sin problemas:
Por supuesto, esto significa que algunas suposiciones ya no se pueden hacer (ese valor representa el orden correcto para el tamaño, por ejemplo).
Recuerde, en JavaScript un objeto es como un mapa o una tabla hash . Un conjunto de pares nombre-valor. Puede recorrerlos o manipularlos sin saber de antemano mucho sobre ellos.
Ejemplo
Y, por cierto, si está interesado en los espacios de nombres, puede echar un vistazo a mi solución para la administración de dependencias y espacios de nombres simples pero potentes para JavaScript: Paquetes JS
fuente
En pocas palabras: no puedes.
Puedes fingirlo, pero no obtendrás seguridad de tipografía. Normalmente, esto se hace creando un diccionario simple de valores de cadena asignados a valores enteros. Por ejemplo:
¿El problema con este enfoque? Puede redefinir accidentalmente su enumerante o accidentalmente tener valores de enumerador duplicados. Por ejemplo:
Editar
Absolutamente,
Object.freeze
solucionaría totalmente el problema del que me quejé. Me gustaría recordarles a todos que cuando escribí lo anterior,Object.freeze
realmente no existía.Ahora ... ahora abre algunas posibilidades muy interesantes.
Edición 2
Aquí hay una muy buena biblioteca para crear enumeraciones.
http://www.2ality.com/2011/10/enums.html
Si bien es probable que no se ajuste a todos los usos válidos de enumeraciones, es muy útil.
fuente
var daysEnum = (function(){ var daysEnum = { monday: 1, tuesday: 2 }; return { get: function(value){ return daysEnum[value]; } } })(); daysEnum.get('monday'); // 1
Esto es lo que todos queremos:
Ahora puedes crear tus enumeraciones:
Al hacer esto, las constantes se pueden acceder de la manera habitual (Sí No, SÍ, Color.GREEN) y obtienen un valor int secuencial (NO = 0, YES = 1; ROJO = 0, VERDE = 1, AZUL = 2).
También puede agregar métodos, utilizando Enum.prototype:
Editar - pequeña mejora - ahora con varargs: (desafortunadamente no funciona correctamente en IE: S ... entonces debería seguir con la versión anterior)
fuente
En la mayoría de los navegadores modernos, hay un tipo de datos primitivo de símbolo que se puede usar para crear una enumeración. Garantizará la seguridad de tipo de la enumeración, ya que JavaScript garantiza que cada valor de símbolo sea único, es decir
Symbol() != Symbol()
. Por ejemplo:Para simplificar la depuración, puede agregar una descripción a los valores de enumeración:
Demo de Plunker
En GitHub puede encontrar un contenedor que simplifica el código requerido para inicializar la enumeración:
fuente
Symbol
está destinado.Object.freeze
solo para personas que no han aceptado el hecho de que "monkeypatch bajo su propio riesgo" es el contrato social de JS?toJSON
en la clase que contiene para usar este enfoque: stackoverflow.com/questions/58499828/…𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲 𝗡𝗮𝗺𝗲𝘀
Veamos directamente el problema: tamaño del archivo. Todas las demás respuestas enumeradas aquí hinchan su código al extremo. Le presento que para obtener el mejor rendimiento posible, legibilidad del código, administración de proyectos a gran escala, sugerencias de sintaxis en muchos editores de código y reducción del tamaño del código por minificación, esta es la forma correcta de hacer enumeraciones: variables de notación de subrayado.
wwwwwwwwww
Como se muestra en el cuadro anterior y en el ejemplo a continuación, aquí hay cinco pasos sencillos para comenzar:
ENUM_
. Si es independiente o de lado a lado, useINDEX_
.ENUM_
oINDEX_
, luego el nombre del grupo, luego un guión bajo y luego un nombre descriptivo único para la propiedadENUMLENGTH_
,ENUMLEN_
,INDEXLENGTH_
, oINDEXLEN_
(siLEN_
oLENGTH_
es preferencia personal) variables enumeradas al final. Debe usar esta variable siempre que sea posible en su código para asegurarse de que agregar una entrada adicional a la enumeración e incrementar este valor no rompa su código.0
no debe ser utilizado como un valor enumerado porque0 == null
,0 == false
,0 == ""
, y otra locura JS. Le presento que, para evitar este problema y aumentar el rendimiento al mismo tiempo, use siempre===
y nunca deje que==
aparezca en su código, excepto contypeof
(extypeof X == "string"
). En todos mis años de uso===
, nunca he tenido un problema con el uso de 0 como valor de enumeración. Si todavía es aprensivo,1
podría usarse como valor inicial enENUM_
enumeraciones (pero no enINDEX_
enumeraciones) sin penalización de rendimiento en muchos casos.Así es como recuerdo cuándo usarlo
INDEX_
y cuándo usarloENUM_
:Sin embargo,
ENUM_
puede, en ciertas circunstancias, ser apropiado como un índice, como al contar las ocurrencias de cada elemento.Observe que, en el código anterior, es realmente fácil agregar un nuevo tipo de mascota: solo tendría que agregar una nueva entrada después
ENUM_PET_RAT
y actualizar enENUMLEN_PET
consecuencia. Puede ser más difícil y con errores agregar una nueva entrada en otros sistemas de enumeración.No de lo que ... ... ¡... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡...
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵 𝗔𝗱𝗱𝗶𝘁𝗶𝗼𝗻
Además, esta sintaxis de enumeraciones permite una clase clara y concisa que se extiende como se ve a continuación. Para extender una clase, agregue un número incremental a la
LEN_
entrada de la clase primaria. Luego, finalice la subclase con su propiaLEN_
entrada para que la subclase se pueda extender aún más en el futuro.(Longitud: 2,450 bytes)
Algunos pueden decir que esto es menos práctico que otras soluciones: quita toneladas de espacio, lleva mucho tiempo escribir y no está recubierto con sintaxis de azúcar. Esas personas tendrían razón si no minimizan su código. Sin embargo, ninguna persona razonable dejaría un código sin minificar en el producto final. Para esta minificación, Closure Compiler es lo mejor que todavía tengo que encontrar. El acceso en línea se puede encontrar aquí . El compilador de cierre puede tomar todos estos datos de enumeración e incorporarlos, lo que hace que su Javascript sea súper pequeño y se ejecute súper rápido. Por lo tanto, Minify with Closure Compiler. Observar.
No de lo que ... ... ¡... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡...
𝗠𝗶𝗻𝗶𝗳𝘆 𝗪𝗶𝘁𝗵 𝗖𝗹𝗼𝘀𝘂𝗿𝗲 𝗖𝗼𝗺𝗽𝗶𝗹𝗲𝗿
El compilador de cierre puede realizar algunas optimizaciones bastante increíbles a través de inferencias que están mucho más allá de las capacidades de cualquier otro minificador de Javascript. Closure Compiler es capaz de incorporar variables primitivas en un valor fijo. Closure Compiler también puede hacer inferencias basadas en estos valores en línea y eliminar bloques no utilizados en sentencias if y bucles.
(Longitud: 605 bytes)
Closure Compiler lo recompensa por codificar de manera más inteligente y organizar bien su código porque, mientras que muchos minificadores castigan el código organizado con un tamaño de archivo minificado más grande, Closure Compiler puede filtrar toda su limpieza y cordura para generar un tamaño de archivo aún más pequeño si usa trucos como enumeraciones de nombres de variables. Eso, en esta mente, es el santo grial de la codificación: una herramienta que ayuda tanto a su código con un tamaño reducido más pequeño como a su mente al entrenar mejores hábitos de programación.
No de lo que ... ... ¡... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡...
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Ahora, veamos qué tan grande sería el archivo equivalente sin ninguna de estas enumeraciones.
Origen sin usar enumeraciones (longitud: 1,973 bytes (¡477 bytes más corto que el código enumerado!))
Minificado sin usar enumeraciones (longitud: 843 bytes (238 bytes más que el código enumerado ))
Como se ve, sin enumeraciones, el código fuente es más corto a costa de un código minificado más grande. No sé sobre ti; pero estoy seguro de que no incorporo el código fuente en el producto final. Por lo tanto, esta forma de enumeración es muy superior en la medida en que da como resultado tamaños de archivo minificados más pequeños.
No de lo que ... ... ¡... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡...
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴 𝗙𝗶𝘅𝗶𝗻𝗴
Otra ventaja de esta forma de enumeración es que se puede usar para administrar fácilmente proyectos a gran escala sin sacrificar el tamaño de código minimizado. Cuando se trabaja en un proyecto grande con muchas otras personas, puede ser beneficioso marcar y etiquetar explícitamente los nombres de las variables con quién creó el código para que el creador original del código pueda identificarse rápidamente para la corrección colaborativa de errores.
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Además, esta forma de enumeración también es mucho más rápida después de la minificación. En las propiedades con nombre normal, el navegador tiene que usar hashmaps para buscar dónde está la propiedad en el objeto. Aunque los compiladores JIT almacenan en caché de forma inteligente esta ubicación en el objeto, todavía hay una sobrecarga tremenda debido a casos especiales como la eliminación de una propiedad inferior del objeto.
Pero, con arreglos PACKED_ELEMENTS indexados enteros no dispersos continuos , el navegador puede omitir gran parte de esa sobrecarga porque el índice del valor en el arreglo interno ya está especificado. Sí, de acuerdo con el estándar ECMAScript, se supone que todas las propiedades deben tratarse como cadenas. Sin embargo, este aspecto del estándar ECMAScript es muy engañoso sobre el rendimiento porque todos los navegadores tienen optimizaciones especiales para índices numéricos en matrices.
Compare el código de arriba con el código de abajo.
Uno podría objetar el código con enumeraciones que parecen ser mucho más largas que el código con objetos ordinarios, pero la apariencia puede ser engañosa. Es importante recordar que el tamaño del código fuente no es proporcional al tamaño de salida cuando se utiliza el compilador de cierre épico. Observar.
El código minificado sin enumeraciones está arriba y el código minificado con enumeraciones está abajo.
El ejemplo anterior demuestra que, además de tener un rendimiento superior, el código enumerado también da como resultado un tamaño de archivo minimizado más pequeño.
No de lo que ... ... ¡... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡...
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Además, la cereza personal de este en la parte superior está utilizando esta forma de enumeraciones junto con el editor de texto CodeMirror en modo Javascript. El modo de resaltado de sintaxis Javascript de CodeMirror resalta las variables locales en el alcance actual. De esa manera, usted sabe instantáneamente cuando escribe un nombre de variable correctamente porque si el nombre de la variable se declaró previamente con la excepción al ejecutar código con nombres de enumeración mal escritos. Además, las herramientas de JavaScript, como JSLint y Closure Compiler, son muy ruidosas al decirle cuando escribe incorrectamente en un nombre de variable de enumeración. CodeMirror, el navegador y varias herramientas de Javascript juntas hacen que la depuración de esta forma de enumeración sea muy simple y realmente fácil.
var
palabra clave, entonces el nombre de la variable cambiará a un color especial (cian por defecto). Incluso si no utiliza CodeMirror, al menos el navegador arroja un útil[variable name] is not defined
En el fragmento anterior, se le alertó con un error porque
ENUM_COLORENUM_DNE
no existe.No de lo que ... ... ¡... ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡...
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Creo que es seguro decir que esta metodología de enumeración es, de hecho, la mejor manera de ir no solo para el tamaño de código minimizado, sino también para el rendimiento, la depuración y la colaboración.
Después de leer una pregunta útil, agradezco al autor por dedicar tiempo a su escritura haciendo clic en la flecha superior izquierda hacia arriba en el cuadro de preguntas. Cada cuadro de respuesta también tiene una de estas flechas hacia arriba.
fuente
colors.REED
rendimientosundefined
), por lo que los errores tipográficos crean acertijos escurridizos. YEA no distingue entre el uso de enumeraciones como índices e ID, lo que lleva a un código confuso donde todo se ve igual. ...He estado jugando con esto, ya que amo mis enumeraciones. =)
Usando
Object.defineProperty
creo que se me ocurrió una solución algo viable.Aquí hay un jsfiddle: http://jsfiddle.net/ZV4A6/
Usando este método ... debería (en teoría) poder llamar y definir valores de enumeración para cualquier objeto, sin afectar otros atributos de ese objeto.
Debido al atributo,
writable:false
esto debería hacer que sea seguro.Por lo tanto, debería poder crear un objeto personalizado y luego invocarlo
Enum()
. Los valores asignados comienzan en 0 y se incrementan por elemento.fuente
return this;
al final de Enum, podría hacer:var EnumColors = {}.Enum('RED','BLUE','GREEN','YELLOW');
false
es el valor predeterminado parawritable
,enumerable
yconfigurable
. No hay necesidad de masticar los valores predeterminados.Usar proxies Javascript
TLDR: agregue esta clase a sus métodos de utilidad y úsela en todo su código, se burla del comportamiento de Enum de los lenguajes de programación tradicionales y en realidad arroja errores cuando intenta acceder a un enumerador que no existe o agregar / actualizar un enumerador. No hay necesidad de confiar
Object.freeze()
.Luego cree enumeraciones instanciando la clase:
Explicación completa:
Una característica muy beneficiosa de Enums que obtienes de los idiomas tradicionales es que explotan (arrojan un error en tiempo de compilación) si intentas acceder a un enumerador que no existe.
Además de congelar la estructura de enumeración burlada para evitar que se agreguen valores adicionales accidental / maliciosamente, ninguna de las otras respuestas aborda esa característica intrínseca de Enums.
Como probablemente sepa, acceder a miembros no existentes en JavaScript simplemente devuelve
undefined
y no explota su código. Como los enumeradores son constantes predefinidas (es decir, días de la semana), nunca debería haber un caso en el que un enumerador no esté definido.No me malinterpreten, el comportamiento de JavaScript de regresar
undefined
al acceder a propiedades indefinidas es en realidad una característica muy poderosa del lenguaje, pero no es una característica que desea cuando intenta burlarse de las estructuras tradicionales de Enum.Aquí es donde brillan los objetos proxy. Los proxies se estandarizaron en el lenguaje con la introducción de ES6 (ES2015). Aquí está la descripción de MDN:
De manera similar a un proxy de servidor web, los proxys de JavaScript pueden interceptar operaciones en objetos (con el uso de "trampas", llámelos ganchos si lo desea) y le permiten realizar varias comprobaciones, acciones y / o manipulaciones antes de que se completen (o en algunos casos, detener por completo las operaciones, que es exactamente lo que queremos hacer si tratamos de hacer referencia a un enumerador que no existe).
Aquí hay un ejemplo artificial que usa el objeto Proxy para imitar Enums. Los enumeradores en este ejemplo son métodos HTTP estándar (es decir, "GET", "POST", etc.):
Aparte: ¿Qué diablos es un proxy?
Recuerdo que cuando comencé a ver la palabra proxy en todas partes, definitivamente no tenía sentido para mí por mucho tiempo. Si ese es usted en este momento, creo que una forma fácil de generalizar proxies es pensar en ellos como software, instituciones o incluso personas que actúan como intermediarios o intermediarios entre dos servidores, empresas o personas.
fuente
valueOf
método predeterminado al especificarlo como método de instancia en la clase Enum. Sin embargo, ¿por qué quiere acceder de esta manera en lugar de simplemente acceder a él mediante la notación de puntos?logLevelEnum[settings.get("log_level")]
? agregarparseOrThrow
solo sería repetitivo a lo que las trampas de proxy ya están haciendo por usted.Este es uno antiguo que conozco, pero la forma en que se ha implementado a través de la interfaz TypeScript es:
Esto le permite buscar tanto en lo
MyEnum.Bar
que devuelve 1 como en loMyEnum[1]
que devuelve "Barra" independientemente del orden de la declaración.fuente
enum MyEnum { Foo, Bar, Foobar }
En ES7 , puede hacer un ENUM elegante basándose en atributos estáticos:
entonces
La ventaja (de usar la clase en lugar del objeto literal) es tener una clase principal,
Enum
entonces todas las enumeraciones extenderán esa clase.fuente
new ColorEnum()
No tiene absolutamente ningún sentido.Enum
tiene estándar estática métodos empadronador en él, comogetValues()
,getNames()
,iterate()
, etc. Si ese es el caso, usted no tiene que volver a implementar los mismos en cada nuevo tipo deenum
.Esta es la solución que uso.
Y define sus enumeraciones de esta manera:
Y así es como accedes a tus enumeraciones:
Usualmente uso los últimos 2 métodos para mapear enumeraciones de objetos de mensaje.
Algunas ventajas de este enfoque:
Algunas desventajas:
fuente
Crear un objeto literal:
fuente
const
no hace que las propiedades del objeto sean inmutables, solo significa que la variableModes
no se puede reasignar a otra cosa. Para hacerlo más completo, úsaloObject.freeze()
juntoconst
.Object.freeze
. Impide que Closure Compiler forre el objeto.Si está utilizando Backbone , puede obtener una funcionalidad de enumeración completa (buscar por id, nombre, miembros personalizados) de forma gratuita mediante Backbone.Collection .
fuente
tus respuestas son demasiado complicadas
fuente
He modificado la solución de Andre 'Fi':
Prueba:
fuente
Se me ocurrió este enfoque, que se basa en las enumeraciones en Java. Estos son de tipo seguro, por lo que también puede realizar
instanceof
verificaciones.Puede definir enumeraciones como esta:
Days
ahora se refiere a laDays
enumeración:La implementación:
fuente
freeze
método para la compatibilidad con versiones anteriores? Por ejemplo,if (Object.freeze) { Object.freeze(values); }
IE8 no es compatible con el método freeze ().
Fuente: http://kangax.github.io/compat-table/es5/ , haga clic en "¿Mostrar navegadores obsoletos?" en la parte superior y verifique IE8 y congele la intersección de la fila de columnas.
En mi proyecto de juego actual, lo he usado a continuación, ya que pocos clientes aún usan IE8:
También podríamos hacer:
o incluso esto:
El último, parece más eficiente para la cadena, reduce su ancho de banda total si tiene un servidor y un cliente que intercambian estos datos.
Por supuesto, ahora es su deber asegurarse de que no haya conflictos en los datos (RE, EX, etc. deben ser únicos, también 1, 2, etc. deben ser únicos). Tenga en cuenta que debe mantenerlos para siempre para la compatibilidad con versiones anteriores.
Asignación:
Comparacion:
fuente
No necesita asegurarse de no asignar números duplicados a diferentes valores de enumeración de esta manera. Un nuevo objeto se instancia y se asigna a todos los valores de enumeración.
fuente
Aquí hay un par de formas diferentes de implementar enumeraciones TypeScript .
La forma más fácil es simplemente iterar sobre un objeto, agregando pares clave-valor invertidos al objeto. El único inconveniente es que debe establecer manualmente el valor para cada miembro.
Y aquí hay un lodash mixin para crear una enumeración usando una cadena. Si bien esta versión es un poco más complicada, hace la numeración automáticamente por usted. Todos los métodos lodash utilizados en este ejemplo tienen un equivalente de JavaScript regular, por lo que puede cambiarlos fácilmente si lo desea.
fuente
Acabo de publicar un paquete NPM gen_enum le permite crear una estructura de datos de Enum en Javascript rápidamente:
Una cosa buena de esta pequeña herramienta es en el entorno moderno (incluidos los navegadores nodejs e IE 9+), el objeto Enum devuelto es inmutable.
Para obtener más información, consulte https://github.com/greenlaw110/enumjs
Actualizaciones
Obtuve el paquete obsoleto
gen_enum
y fusiono la función en el paquete constjs , que proporciona más funciones, incluidos objetos inmutables, deserialización de cadenas JSON, constantes de cadenas y generación de mapas de bits, etc. Consulte https://www.npmjs.com/package/constjs para obtener más informaciónPara actualizar desde
gen_enum
queconstjs
acaba de cambiar la declaracióna
fuente
La solución más simple:
Crear
Obtenga valor
Obtener la clave
fuente
He creado una clase Enum que puede obtener valores Y nombres en O (1). También puede generar una matriz de objetos que contiene todos los nombres y valores.
Puedes iniciarlo así:
Para obtener un valor (como Enums en C #):
Para buscar un nombre para un valor (puede ser ambiguo al poner el mismo valor para diferentes nombres):
Para obtener una matriz con cada nombre y valor en un objeto:
Generará:
También puede obtener las opciones de selección html fácilmente:
Que tiene:
fuente
A pesar de que solo los métodos estáticos (y no las propiedades estáticas) son compatibles con ES2015 (consulte aquí también, §15.2.2.2), curiosamente puede usar lo siguiente con Babel con el valor
es2015
predeterminado:Descubrí que esto funciona como se esperaba incluso en todos los módulos (por ejemplo, importar la
CellState
enumeración de otro módulo) y también cuando importo un módulo usando Webpack.La ventaja que tiene este método sobre la mayoría de las otras respuestas es que puede usarlo junto con un verificador de tipo estático (por ejemplo, Flow ) y puede afirmar, en el momento del desarrollo usando la verificación de tipo estático, que sus variables, parámetros, etc. son específicos
CellState
" enum "en lugar de algún otro enum (que sería imposible de distinguir si utilizara objetos o símbolos genéricos).actualizar
El código anterior tiene una deficiencia, ya que le permite a uno crear objetos de tipo adicionales
CellState
(a pesar de que uno no puede asignarlos a los campos estáticosCellState
ya que está congelado). Aún así, el siguiente código más refinado ofrece las siguientes ventajas:CellState
se pueden crearla
values
función que devuelve todas las instancias de la enumeración no tiene que crear el valor de retorno de la manera anterior, manual (y propensa a errores).fuente
es7 way, (iterador, congelación), uso:
código:
fuente
Así es como mecanografía se traduce
enum
en Javascript:Ahora:
Al principio estaba confundido por qué
obj[1]
regresa'Active'
, pero luego me di cuenta de que es muy simple: el operador de asignación asigna un valor y luego lo devuelve:fuente
Puedes hacer algo como esto
Como se define en esta biblioteca. https://github.com/webmodule/foo/blob/master/foo.js#L217
Ejemplo completo https://gist.github.com/lnt/bb13a2fd63cdb8bce85fd62965a20026
fuente
Una forma rápida y sencilla sería:
fuente
Al momento de escribir, octubre de 2014 , aquí hay una solución contemporánea. Estoy escribiendo la solución como un módulo de nodo, y he incluido una prueba con Mocha y Chai, así como subrayar JS. Puede ignorarlos fácilmente y simplemente tomar el código Enum si lo prefiere.
Visto muchas publicaciones con bibliotecas demasiado complicadas, etc. La solución para obtener soporte de enumeración en Javascript es tan simple que realmente no es necesaria. Aquí está el código:
Archivo: enums.js
Y una prueba para ilustrar lo que te da:
archivo: enumsSpec.js
Como puede ver, obtiene una fábrica de Enum, puede obtener todas las claves simplemente llamando a enum.keys, y puede hacer coincidir las claves con constantes enteras. Y puede reutilizar la fábrica con diferentes valores y exportar los Enums generados utilizando el enfoque modular de Node.
Una vez más, si solo es un usuario ocasional, o en el navegador, etc., simplemente tome la parte de fábrica del código, y también puede eliminar la biblioteca de subrayado si no desea usarlo en su código.
fuente
Es fácil de usar, creo. https://stackoverflow.com/a/32245370/4365315
ACTUALIZAR:
Hay mis códigos de ayuda (
TypeHelper
).Mostrar fragmento de código
fuente