Qual é a sintaxe preferida para definir enumerações em JavaScript? Algo como:
my.namespace.ColorEnum = {
RED : 0,
GREEN : 1,
BLUE : 2
}
// later on
if(currentColor == my.namespace.ColorEnum.RED) {
// whatever
}
Ou existe um idioma mais preferível?
javascript
syntax
enums
David Citron
fonte
fonte
0
como um número de enumeração. A menos que seja usado para algo que não foi definido. JS tratafalse || undefined || null || 0 || "" || '' || NaN
todos com o mesmo valor quando comparado ao uso==
.0 == null
retorna falsefalse == 0
e+null == 0
(e as conversões para números acontecem às vezes quando você não espera), enquantonull == undefined
também e+undefined
éNaN
(emboraNaN != NaN
).Respostas:
Desde a versão 1.8.5, é possível selar e congelar o objeto, então defina o acima como:
ou
e pronto! JS enums.
No entanto, isso não impede que você atribua um valor indesejado a uma variável, que geralmente é o principal objetivo das enumerações:
Uma maneira de garantir um grau mais alto de segurança de tipo (com enumerações ou outras) é usar uma ferramenta como TypeScript ou Flow .
Fonte
As citações não são necessárias, mas eu as guardei por consistência.
fonte
var DaysEnum = Object.freeze ({ monday: {}, tuesday: {}, ... });
. Você não precisa especificar um ID, basta usar um objeto vazio para comparar enumerações.if (incommingEnum === DaysEnum.monday) //incommingEnum is monday
if (Object.freeze) { Object.freeze(DaysEnum); }
({ monday: {},
etc. significa que, se você converter esse objeto para JSON via stringify, obterá o[{"day": {}}]
que não vai funcionar.var DaysEnum = {"monday":1, "tuesday":2, "wednesday":3, ...}
. Comparar objetos como no meu comentário anterior é MUITO MAIS LENTO do que comparar números.Isso não é muita resposta, mas eu diria que funciona muito bem, pessoalmente
Dito isto, já que não importa quais são os valores (você usou 0, 1, 2), eu usaria uma sequência significativa caso você desejasse exibir o valor atual.
fonte
Object.freeze()
. Isso impedirá que outro código altere os valores da enumeração. Exemplo:var ColorEnum = Object.freeze({RED: 0, GREEN: 1, BLUE: 2});
instanceof
verificações. Por exemploColorEnum.RED instanceof ColorEnum
(retornostrue
). Você também pode resolver uma instância sem um nomeColorEnum.fromName("RED") === ColorEnum.RED
(retornostrue
). Cada exemplo também tem um.name()
e um.ordinal()
método, e a própria enum tem umvalues()
método que returnd uma matriz de todas as constantes.ToString()
método. Nós, desenvolvedores JS, já somos muito dependentes de coisas "apenas funcionando"! Além disso, um deve ser capaz de rapidamenteswitch
em um enum. A comparação de strings é mais lenta que a comparação de números; portanto, você terá umswitch
desempenho um pouco pior se usar strings em vez de números inteiros.ATUALIZAR
Obrigado por todos os votos positivos, mas não acho que minha resposta abaixo seja a melhor maneira de escrever enums em JavaScript. Veja minha postagem no blog para obter mais detalhes: Enums em JavaScript .
Alertar o nome já é possível:
Como alternativa, você pode criar objetos de valores, para que você possa comer o bolo e comê-lo também:
No JavaScript, como é uma linguagem dinâmica, é possível adicionar valores de enumeração ao conjunto posteriormente:
Lembre-se de que os campos da enumeração (valor, nome e código neste exemplo) não são necessários para a verificação de identidade e existem apenas por conveniência. Além disso, o nome da propriedade size não precisa ser codificado, mas também pode ser definido dinamicamente. Supondo que você saiba apenas o nome do seu novo valor de enumeração, você ainda pode adicioná-lo sem problemas:
Obviamente, isso significa que algumas suposições não podem mais ser feitas (esse valor representa a ordem correta para o tamanho, por exemplo).
Lembre-se, no JavaScript, um objeto é como um mapa ou tabela de hash . Um conjunto de pares nome-valor. Você pode percorrê-los ou manipulá-los sem saber muito sobre eles com antecedência.
Exemplo
E, a propósito, se você estiver interessado em espaços para nome, talvez queira dar uma olhada na minha solução para gerenciamento de espaço para nome e dependência simples mas poderoso para JavaScript: JS de pacotes
fonte
Conclusão: você não pode.
Você pode fingir, mas não terá segurança de digitação. Normalmente, isso é feito criando um dicionário simples de valores de sequência mapeados para valores inteiros. Por exemplo:
O problema com esta abordagem? Você pode redefinir acidentalmente seu enumerador ou acidentalmente duplicar valores de enumerador. Por exemplo:
Editar
Absolutamente,
Object.freeze
resolveria totalmente o problema do qual reclamei. Gostaria de lembrar a todos que, quando escrevi o texto acima,Object.freeze
realmente não existia.Agora .... agora abre algumas possibilidades muito interessantes.
Edit 2
Aqui está uma biblioteca muito boa para criar enums.
http://www.2ality.com/2011/10/enums.html
Embora provavelmente não sirva para todos os usos válidos de enumerações, é muito longo.
fonte
var daysEnum = (function(){ var daysEnum = { monday: 1, tuesday: 2 }; return { get: function(value){ return daysEnum[value]; } } })(); daysEnum.get('monday'); // 1
Aqui está o que todos nós queremos:
Agora você pode criar suas enumerações:
Ao fazer isso, as constantes podem ser acessadas da maneira usual (YesNo.YES, Color.GREEN) e elas obtêm um valor int sequencial (NO = 0, YES = 1; RED = 0, VERDE = 1, AZUL = 2).
Você também pode adicionar métodos, usando Enum.prototype:
Editar - pequena melhoria - agora com varargs: (infelizmente não funciona corretamente no IE: S ... deve ficar com a versão anterior)
fonte
Na maioria dos navegadores modernos, existe um tipo de dados primitivo de símbolo que pode ser usado para criar uma enumeração. Isso garantirá a segurança de tipo da enumeração, pois cada valor de símbolo é garantido pelo JavaScript como único, ou seja
Symbol() != Symbol()
. Por exemplo:Para simplificar a depuração, você pode adicionar uma descrição aos valores da enumeração:
Demonstração Plunker
No GitHub, você pode encontrar um wrapper que simplifica o código necessário para inicializar a enumeração:
fonte
Symbol
se destina.Object.freeze
apenas para pessoas que não aceitaram o fato de "monkeypatch por seu próprio risco" ser o contrato social da JS?toJSON
na classe que o continha para usar esta abordagem: stackoverflow.com/questions/58499828/…𝗣𝗹𝗮𝗶𝗻 𝗩𝗮𝗻𝗶𝗹𝗹𝗮𝗝𝗦 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲
Vamos direto ao problema: tamanho do arquivo. Todas as outras respostas listadas aqui incham seu código ao extremo. Apresento a você que, para o melhor desempenho possível, legibilidade do código, gerenciamento de projetos em larga escala, dicas de sintaxe em muitos editores de código e redução no tamanho do código por minificação, esta é a maneira correta de fazer enumerações: variáveis de notação sublinhada.
wvwvwvwvwwwwwwwwwwwwvwvwvwvwvwvwvwvwvwvwvwwwvvvvvvvvvvvvvvvvv
Conforme demonstrado na tabela acima e no exemplo abaixo, aqui estão cinco etapas fáceis para começar:
ENUM_
. Se independente ou lado a lado, useINDEX_
.ENUM_
ouINDEX_
, então o nome do grupo, um sublinhado e um nome amigável exclusivo para a propriedadeENUMLENGTH_
,ENUMLEN_
,INDEXLENGTH_
, ouINDEXLEN_
(seLEN_
ouLENGTH_
é preferência pessoal) variável enumerados no final. Você deve usar essa variável sempre que possível em seu código para garantir que adicionar uma entrada extra à enumeração e incrementar esse valor não interrompa seu código.0
não deve ser usado como um valor enumerado porque0 == null
,0 == false
,0 == ""
, e outra loucura JS. Eu submeto a você que, para evitar esse problema e aumentar o desempenho ao mesmo tempo, sempre use===
e nunca deixe==
aparecer no seu código, exceto comtypeof
(extypeof X == "string"
). Em todos os meus anos de uso===
, nunca tive problemas com o uso de 0 como valor de enumeração. Se você ainda é sensível,1
pode ser usado como o valor inicial emENUM_
enumerações (mas não emINDEX_
enumerações) sem penalidade de desempenho em muitos casos.Aqui está como eu lembro quando usar
INDEX_
e quando usarENUM_
:No entanto,
ENUM_
em determinadas circunstâncias, pode ser apropriado como um índice, como na contagem das ocorrências de cada item.Observe que, no código acima, é realmente fácil adicionar um novo tipo de animal de estimação: você apenas precisa acrescentar uma nova entrada depois
ENUM_PET_RAT
e atualizar deENUMLEN_PET
acordo. Pode ser mais difícil e complicado adicionar uma nova entrada em outros sistemas de enumeração.wvwwvw wvwvwvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvwwvwwwwwvvvwvv
𝗘𝘅𝘁𝗲𝗻𝗱 𝗨𝗽𝗽𝗲𝗿𝗰𝗮𝘀𝗲 𝗩𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀 𝗪𝗶𝘁𝗵
Além disso, essa sintaxe de enumerações permite a extensão clara e concisa da classe, conforme mostrado abaixo. Para estender uma classe, adicione um número incremental à
LEN_
entrada da classe pai. Em seguida, termine a subclasse com sua própriaLEN_
entrada, para que a subclasse possa ser estendida ainda mais no futuro.(Comprimento: 2.450 bytes)
Alguns podem dizer que isso é menos prático do que outras soluções: consome muito espaço, leva muito tempo para escrever e não é revestido com a sintaxe do açúcar. Essas pessoas estariam certas se não reduzissem seu código. No entanto, nenhuma pessoa razoável deixaria código não minificado no produto final. Para esta minificação, o Closure Compiler é o melhor que ainda tenho para encontrar. O acesso online pode ser encontrado aqui . O compilador de fechamento é capaz de pegar todos esses dados de enumeração e incorporá-los, tornando seu Javascript super super pequeno e executando super super rápido. Portanto, Minimize com o Closure Compiler. Observar.
wvwwvw wvwvwvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvwwvwwwwwvvvwvv
𝗠𝗶𝗻𝗶𝗳𝘆 𝗪𝗶𝘁𝗵 𝗖𝗹𝗼𝘀𝘂𝗿𝗲
O compilador de fechamento é capaz de executar algumas otimizações bastante incríveis por meio de inferências que estão muito além das capacidades de qualquer outro minificador de Javascript. O Closure Compiler é capaz de alinhar variáveis primitivas definidas para um valor fixo. O Closure Compiler também é capaz de fazer inferências com base nesses valores embutidos e eliminar blocos não utilizados nas instruções if e loops.
(Comprimento: 605 bytes)
O Closure Compiler recompensa você por codificar de forma mais inteligente e organizar bem o seu código, porque, enquanto muitos minificadores punem o código organizado com um tamanho de arquivo minificado maior, o Closure Compiler pode filtrar toda a sua limpeza e sanidade para gerar um tamanho de arquivo ainda menor se você usar truques como enumerações de nomes de variáveis. Esse, nessa única mente, é o santo graal da codificação: uma ferramenta que ajuda seu código com um tamanho reduzido menor e ajuda sua mente treinando melhores hábitos de programação.
wvwwvw wvwvwvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvwwvwwwwwvvvwvv
𝗦𝗺𝗮𝗹𝗹𝗲𝗿 𝗖𝗼𝗱𝗲 𝗦𝗶𝘇𝗲
Agora, vamos ver o tamanho do arquivo equivalente sem nenhuma dessas enumerações.
Origem sem usar enumerações (comprimento: 1.973 bytes (477 bytes a menos que o código enumerado!))
Minificado sem usar enumerações (comprimento: 843 bytes (238 bytes a mais que o código enumerado ))
Como visto, sem enumerações, o código fonte é mais curto ao custo de um código minificado maior. Não sei sobre você; mas tenho certeza de que não incorporo o código-fonte ao produto final. Portanto, essa forma de enumerações é muito superior, pois resulta em tamanhos menores de arquivos minificados.
wvwwvw wvwvwvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvwwvwwwwwvvvwvv
𝗖𝗼𝗼𝗽𝗲𝗿𝗮𝘁𝗶𝘃𝗲 🤝 𝗕𝘂𝗴
Outra vantagem sobre essa forma de enumeração é que ela pode ser usada para gerenciar facilmente projetos de grande escala sem sacrificar o tamanho reduzido do código. Ao trabalhar em um projeto grande com muitas outras pessoas, pode ser benéfico marcar e rotular explicitamente os nomes das variáveis com quem criou o código, para que o criador original do código possa ser rapidamente identificado para a correção colaborativa de erros.
𝗦𝘂𝗽𝗲𝗿𝗶𝗼𝗿 𝗣𝗲𝗿𝗳𝗼𝗿𝗺𝗮𝗻𝗰𝗲
Além disso, essa forma de enumeração também é muito mais rápida após a minificação. Nas propriedades nomeadas normais, o navegador precisa usar hashmaps para procurar onde a propriedade está no objeto. Embora os compiladores JIT armazenem em cache esse local de maneira inteligente no objeto, ainda há uma enorme sobrecarga devido a casos especiais, como a exclusão de uma propriedade mais baixa do objeto.
Mas, com matrizes PACKED_ELEMENTS indexadas a números inteiros não esparsos , o navegador pode ignorar grande parte dessa sobrecarga, porque o índice do valor na matriz interna já foi especificado. Sim, de acordo com o padrão ECMAScript, todas as propriedades devem ser tratadas como seqüências de caracteres. No entanto, esse aspecto do padrão ECMAScript é muito enganador quanto ao desempenho, porque todos os navegadores possuem otimizações especiais para índices numéricos em matrizes.
Compare o código acima com o código abaixo.
Pode-se objetar ao código com enumerações que parecem muito mais longas do que o código com objetos comuns, mas a aparência pode enganar. É importante lembrar que o tamanho do código-fonte não é proporcional ao tamanho da saída ao usar o épico Closure Compiler. Observar.
O código minificado sem enumerações está acima e o código minificado com enumerações está abaixo.
O exemplo acima demonstra que, além de ter um desempenho superior, o código enumerado também resulta em um tamanho de arquivo minificado menor.
wvwwvw wvwvwvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvwwvwwwwwvvvwvv
𝗘𝗮𝘀𝘆 𝗗𝗲𝗯𝘂𝗴𝗴𝗶𝗻𝗴
Além disso, a cereja pessoal dessa pessoa no topo está usando essa forma de enumerações junto com o editor de texto CodeMirror no modo Javascript. O modo de destaque da sintaxe Javascript do CodeMirror destaca variáveis locais no escopo atual. Dessa forma, você saberá instantaneamente quando digitar um nome de variável corretamente, porque se o nome da variável tiver sido declarado anteriormente com a
var
palavra - chave, o nome da variável ficará com uma cor especial (ciano por padrão). Mesmo se você não usar o CodeMirror, pelo menos o navegador exibirá uma ajuda[variable name] is not defined
exceção ao executar código com nomes de enumeração digitados incorretamente. Além disso, ferramentas JavaScript, como JSLint e Closure Compiler, falam muito alto quando você digita incorretamente o nome de uma variável de enumeração. O CodeMirror, o navegador e várias ferramentas Javascript juntas tornam a depuração dessa forma de enumeração muito simples e muito fácil.No trecho acima, você foi alertado com um erro porque
ENUM_COLORENUM_DNE
não existe.wvwwvw wvwvwvw wvwvwv vwvwvw wvwvvw wvwwvw wvwvwvw wvwvw wvwvwv vwvxwvw wvwvvwwvwwwwwvvvwvv
𝗖𝗼𝗻𝗰𝗹𝘂𝘀𝗶𝗼𝗻 ☑
Eu acho seguro dizer que essa metodologia de enumeração é realmente a melhor maneira de seguir não apenas o tamanho reduzido do código, mas também o desempenho, a depuração e a colaboração.
Depois de ler uma pergunta útil, agradeço ao autor por dedicar tempo à sua escrita clicando na seta superior esquerda na caixa de perguntas. Cada caixa de resposta também possui uma dessas setas para cima.
fonte
colors.REED
rendimentosundefined
), portanto, erros de digitação criam enigmas indescritíveis. O YEA não distingue entre o uso de enumerações como índices e IDs, levando a códigos confusos onde tudo parece igual. …Eu tenho brincado com isso, porque eu amo meus enums. =)
Usando
Object.defineProperty
eu acho que surgiu uma solução um tanto viável.Aqui está um jsfiddle: http://jsfiddle.net/ZV4A6/
Utilizando este método, você deve (em teoria) ser capaz de chamar e definir valores de enumeração para qualquer objeto, sem afetar outros atributos desse objeto.
Por causa do atributo,
writable:false
isso deve torná-lo seguro.Portanto, você poderá criar um objeto personalizado e, em seguida, invocá
Enum()
-lo. Os valores atribuídos começam em 0 e incrementam por item.fonte
return this;
no final de Enum, você poderá fazer:var EnumColors = {}.Enum('RED','BLUE','GREEN','YELLOW');
false
é o padrão parawritable
,enumerable
econfigurable
. Não há necessidade de mastigar os padrões.Usar proxies Javascript
TLDR: adicione essa classe aos métodos utilitários e use-a em todo o código, zomba do comportamento do Enum das linguagens de programação tradicionais e, na verdade, gera erros quando você tenta acessar um enumerador que não existe ou adicionar / atualizar um enumerador. Não há necessidade de confiar
Object.freeze()
.Em seguida, crie enums instanciando a classe:
Explicação completa:
Um recurso muito benéfico do Enums que você obtém dos idiomas tradicionais é que eles explodem (gera um erro em tempo de compilação) se você tentar acessar um enumerador que não existe.
Além de congelar a estrutura de enum simulada para impedir que valores adicionais sejam adicionados acidental / maliciosamente, nenhuma das outras respostas aborda esse recurso intrínseco do Enums.
Como você provavelmente sabe, acessar membros não existentes no JavaScript simplesmente retorna
undefined
e não explode seu código. Como os enumeradores são constantes predefinidas (ou seja, dias da semana), nunca deve haver um caso em que um enumerador deve ser indefinido.Não me interpretem mal, o comportamento do JavaScript de retornar
undefined
ao acessar propriedades indefinidas é realmente um recurso muito poderoso da linguagem, mas não é um recurso que você deseja quando tenta zombar das estruturas tradicionais do Enum.É aqui que os objetos Proxy brilham. Os proxies foram padronizados no idioma com a introdução do ES6 (ES2015). Aqui está a descrição do MDN:
Semelhante a um proxy de servidor da Web, os proxies JavaScript podem interceptar operações em objetos (com o uso de "traps", chamá-los de ganchos, se desejar) e permitem executar várias verificações, ações e / ou manipulações antes de serem concluídas (ou em alguns casos, interromper completamente as operações, exatamente o que queremos fazer se e quando tentamos fazer referência a um enumerador que não existe).
Aqui está um exemplo artificial que usa o objeto Proxy para imitar Enums. Os enumeradores neste exemplo são métodos HTTP padrão (por exemplo, "GET", "POST" etc.):
LADO: O que diabos é um proxy?
Lembro-me de quando comecei a ver a palavra proxy em todos os lugares, definitivamente não fazia sentido para mim por um longo tempo. Se é você agora, acho que uma maneira fácil de generalizar proxies é pensar neles como software, instituições ou até pessoas que agem como intermediários ou intermediários entre dois servidores, empresas ou pessoas.
fonte
valueOf
método padrão especificando-o como método de instância na classe Enum. No entanto, por que você deseja acessá-lo dessa maneira, em vez de acessá-lo por meio de notação de ponto?logLevelEnum[settings.get("log_level")]
? adicionarparseOrThrow
seria repetitivo ao que os traps de proxy já estão fazendo por você.Essa é uma versão antiga que eu conheço, mas a maneira como foi implementada desde a interface TypeScript é:
Isso permite que você procure os dois
MyEnum.Bar
que retornam 1 e osMyEnum[1]
que retornam "Bar", independentemente da ordem da declaração.fonte
enum MyEnum { Foo, Bar, Foobar }
No ES7 , você pode criar um ENUM elegante com base em atributos estáticos:
então
A vantagem (de usar classe em vez de objeto literal) é ter uma classe pai,
Enum
então todos os seus Enums estenderão essa classe.fonte
new ColorEnum()
não faz absolutamente nenhum sentido.Enum
tem padrão estática métodos enumerador sobre ele, comogetValues()
,getNames()
,iterate()
, etc. Se for esse o caso, você não tem que reimplementar-los para cada novo tipo deenum
.Esta é a solução que eu uso.
E você define suas enumerações assim:
E é assim que você acessa suas enumerações:
Eu costumo usar os dois últimos métodos para mapear enumerações de objetos de mensagem.
Algumas vantagens dessa abordagem:
Algumas desvantagens:
fonte
Crie um literal de objeto:
fonte
const
não torna as propriedades do objeto imutáveis, significa apenas que a variávelModes
não pode ser reatribuída para outra coisa. Para torná-lo mais completo, useObject.freeze()
ao ladoconst
.Object.freeze
. Impede que o Closure Compiler incline o objeto.Se você estiver usando o Backbone , poderá obter a funcionalidade completa da enum (encontre por ID, nome, membros personalizados) gratuitamente usando o Backbone.Collection .
fonte
suas respostas são muito complicadas
fonte
Eu modifiquei a solução de Andre 'Fi':
Teste:
fonte
Eu vim com essa abordagem que é modelada após enumerações em Java. Estes são seguros para o tipo e, assim, você pode executar
instanceof
verificações.Você pode definir enumerações como esta:
Days
agora se refere aoDays
enum:A implementação:
fonte
freeze
método para compatibilidade com versões anteriores? Por exemplo,if (Object.freeze) { Object.freeze(values); }
O IE8 não suporta o método freeze ().
Fonte: http://kangax.github.io/compat-table/es5/ , clique em "Mostrar navegadores obsoletos?" na parte superior e marque IE8 e congele a interseção de linhas.
No meu projeto de jogo atual, usei abaixo, pois poucos clientes ainda usam o IE8:
Nós também poderíamos fazer:
ou até isso:
O último, parece mais eficiente para string, reduz sua largura de banda total se você tiver servidor e cliente trocando esses dados.
Obviamente, agora é seu dever garantir que não haja conflitos nos dados (RE, EX, etc. devem ser únicos, também 1, 2, etc. devem ser únicos). Observe que você precisa mantê-los para sempre para compatibilidade com versões anteriores.
Tarefa:
Comparação:
fonte
Você não precisa se certificar de não atribuir números duplicados a diferentes valores de enum dessa maneira. Um novo objeto é instanciado e atribuído a todos os valores de enumeração.
fonte
Aqui estão algumas maneiras diferentes de implementar enumerações TypeScript .
A maneira mais fácil é apenas iterar sobre um objeto, adicionando pares de valores-chave invertidos ao objeto. A única desvantagem é que você deve definir manualmente o valor para cada membro.
E aqui está uma mistura de lodash para criar uma enumeração usando uma string. Embora esta versão seja um pouco mais envolvida, ela faz a numeração automaticamente para você. Todos os métodos lodash usados neste exemplo têm um equivalente JavaScript regular, portanto você pode trocá-los facilmente, se desejar.
fonte
Acabei de publicar um pacote NPM gen_enum permite criar rapidamente a estrutura de dados do Enum em Javascript:
Uma coisa legal dessa pequena ferramenta é que, no ambiente moderno (incluindo os navegadores nodejs e IE 9+), o objeto Enum retornado é imutável.
Para mais informações, consulte https://github.com/greenlaw110/enumjs
Atualizações
Eu obsoleto o
gen_enum
pacote e mesclo a função no pacote constjs , que fornece mais recursos, incluindo objetos imutáveis, desserialização de string JSON, constantes de string e geração de bitmap etc. Checkout https://www.npmjs.com/package/constjs para obter mais informaçõesPara atualizar de
gen_enum
paraconstjs
apenas alterar a instruçãopara
fonte
Solução mais simples:
Crio
Obter valor
Obter chave
fonte
Eu criei uma classe Enum que pode buscar valores E nomes em O (1). Também pode gerar uma Matriz de Objetos contendo todos os Nomes e Valores.
Você pode iniciar assim:
Para buscar um valor (como Enums em C #):
Para buscar um nome para um valor (pode ser ambíguo ao colocar o mesmo valor para nomes diferentes):
Para obter uma matriz com cada nome e valor em um objeto:
Irá gerar:
Você também pode obter as opções de seleção html prontamente:
Que contém:
fonte
Embora apenas métodos estáticos (e não propriedades estáticas) sejam suportados no ES2015 (veja aqui também, §15.2.2.2), curiosamente, você pode usar o abaixo com Babel com a
es2015
predefinição:Eu achei que isso funcionava conforme o esperado, mesmo em módulos (por exemplo, importar o
CellState
enum de outro módulo) e também quando importo um módulo usando o Webpack.A vantagem que esse método tem sobre a maioria das outras respostas é que você pode usá-lo juntamente com um verificador de tipo estático (por exemplo, Flow ) e pode afirmar, no tempo de desenvolvimento usando a verificação de tipo estático, que suas variáveis, parâmetros etc. são específicos
CellState
" enumeração "em vez de outra enumeração (que seria impossível distinguir se você usasse objetos ou símbolos genéricos).atualizar
O código acima tem uma deficiência, pois permite a criação de objetos adicionais do tipo
CellState
(mesmo que não seja possível atribuí-los aos campos estáticos,CellState
pois estão congelados). Ainda assim, o código mais refinado abaixo oferece as seguintes vantagens:CellState
podem ser criadosa
values
função que retorna todas as instâncias da enum não precisa criar o valor de retorno da maneira acima, manual (e propensa a erros).fonte
es7 way, (iterador, congelar), uso:
código:
fonte
É assim que o Typescript o traduz
enum
para Javascript:Agora:
No começo, fiquei confuso por que
obj[1]
retorna'Active'
, mas depois percebi que é muito simples - o operador de atribuição atribui valor e depois o retorna:fonte
Você pode fazer algo assim
Conforme definido nesta biblioteca. https://github.com/webmodule/foo/blob/master/foo.js#L217
Exemplo completo https://gist.github.com/lnt/bb13a2fd63cdb8bce85fd62965a20026
fonte
Uma maneira rápida e simples seria:
fonte
No momento da redação, outubro de 2014 - aqui está uma solução contemporânea. Estou escrevendo a solução como um módulo de nó e incluímos um teste usando Mocha e Chai, além de sublinhar o JS. Você pode ignorá-los facilmente e, se preferir, use o código Enum.
Visto muitas postagens com bibliotecas excessivamente complicadas, etc. A solução para obter suporte a enum em Javascript é tão simples que realmente não é necessária. Aqui está o código:
Arquivo: enums.js
E um teste para ilustrar o que ele oferece:
arquivo: enumsSpec.js
Como você pode ver, você obtém uma fábrica de Enum, pode obter todas as chaves simplesmente chamando enum.keys e pode combinar as próprias chaves com constantes inteiras. E você pode reutilizar a fábrica com valores diferentes e exportar os Enums gerados usando a abordagem modular do Node.
Mais uma vez, se você é apenas um usuário casual, ou no navegador, etc, apenas pegue a parte de fábrica do código, removendo potencialmente a biblioteca de sublinhado também, se você não quiser usá-la em seu código.
fonte
É fácil de usar, eu acho. https://stackoverflow.com/a/32245370/4365315
ATUALIZAR:
Existem os meus códigos auxiliares (
TypeHelper
).Mostrar snippet de código
fonte