Existe uma maneira de usar constantes em JavaScript ?
Caso contrário, qual é a prática comum para especificar variáveis usadas como constantes?
javascript
constants
fuentesjr
fonte
fonte
Chrome
permite que você use a palavraconst
- chave para usar constantes. por exemploconst ASDF = "asdf"
. No entanto, comoconst
não é compatível com vários navegadores, costumo ficar com umavar
declaração.try{const thing=1091;}catch(e){var thing=1091;}
trabalho.const
ou devar
todo?const
tem o mesmo escopovar
e o nível de função, não o nível de bloco. Se você seguir o próximo padrão ECMAScript, teráconst
o mesmo escopo quelet
, o que significa que não funcionará.Respostas:
Desde o ES2015 , o JavaScript tem uma noção de
const
:Isso funcionará em praticamente todos os navegadores, exceto no IE 8, 9 e 10 . Alguns também podem precisar do modo estrito ativado.
Você pode usar
var
com convenções como ALL_CAPS para mostrar que determinados valores não devem ser modificados se você precisar oferecer suporte a navegadores mais antigos ou se estiver trabalhando com código legado:fonte
const
palavra - chave. Atualmente, é suportado por todos os navegadores modernos, exceto o IE.Object.defineProperty
para criar propriedades somente leitura que também não podem ser excluídas. Isso funciona na versão atual de todos os principais navegadores (mas incorretamente no IE8 ). Veja a resposta por @NotANameconst
palavra-chave agora faz parte oficialmente do idioma e é suportada por todos os navegadores. Segundo o statcounter.com, apenas alguns por cento dos usuários da Internet ainda usam versões antigas de navegadores que não eram compatíveisconst
.Você está tentando proteger as variáveis contra modificações? Nesse caso, você pode usar um padrão de módulo:
Usando essa abordagem, os valores não podem ser modificados. Mas, você precisa usar o método get () no CONFIG :(.
Se você não precisar proteger estritamente o valor das variáveis, faça o que é sugerido e use uma convenção de ALL CAPS.
fonte
CONFIG.get = someNewFunctionThatBreaksTheCode
... Em suma, você absolutamente não pode impor constantes em JS (sem a palavra-chave const). A única coisa que você pode fazer é limitar a visibilidade.private
é uma palavra futura reservada em JavaScript, eu não usaria isso se fosse você.A
const
palavra-chave está no rascunho do ECMAScript 6, mas até agora possui apenas um suporte considerável ao navegador: http://kangax.github.io/compat-table/es6/ . A sintaxe é:fonte
const
, ele não gera erros. A atribuição simplesmente falha e a constante ainda tem seu valor original. Esta é uma das principais falhas de design do IMHO, mas enquanto houver uma convenção de nomenclatura clara e consistente (como o popular ALL_CAPS), não acho que isso causaria muita dor.'use strict'
.ALL CAPS
?Consulte Object.freeze . Você pode usar
const
se quiser tornar aconstants
referência somente leitura.fonte
i
const
declaração ES6 , por exemplo, as propriedades não podem ser declaradas ou atribuídas novamente, mas, se forem do tipo de dadosobject
, poderão ser alteradas.const constants
vez devar constants
impedir que a variável seja reatribuída.O IE suporta constantes, como, por exemplo:
fonte
const
). Você pode explicar o que há de errado com isso?O ECMAScript 5 apresenta
Object.defineProperty
:É suportado em todos os navegadores modernos (assim como no IE ≥ 9).
Consulte também: Object.defineProperty no ES5?
fonte
writable: false
causará um erro se o código que executa a atribuição estiver sendo interpretado no modo estrito do ECMAScript 5. Apenas outro motivo para escrever'use strict'
no seu código.writable: false
já que esse é o padrão .Não, não em geral. O Firefox implementa,
const
mas eu sei que o IE não.@John aponta para uma prática comum de nomeação para consts que é usada há anos em outros idiomas. Não vejo razão para que você não possa usá-la. Claro que isso não significa que alguém não irá escrever sobre o valor da variável de qualquer maneira. :)
fonte
Em JavaScript, minha preferência é usar funções para retornar valores constantes.
fonte
Os Documentos da Web MDN da Mozillas contêm bons exemplos e explicações sobre
const
. Excerto:Mas é triste que o IE9 / 10 ainda não suporte
const
. E a razão é absurda :Eles não o implementam porque outros navegadores não o implementaram corretamente ?! Com muito medo de melhorar? Definições de padrões ou não, uma constante é uma constante: defina uma vez, nunca mude.
E para todas as idéias: Todas as funções podem ser substituídas (XSS etc.). Portanto, não há diferença em
var
oufunction(){return}
.const
é a única constante real.Atualização: O IE11 suporta
const
:fonte
Se você não se importa em usar funções:
Essa abordagem fornece funções em vez de variáveis regulares, mas garante * que ninguém poderá alterar o valor depois de definido.
Pessoalmente, acho isso bastante agradável, especialmente depois de me acostumar com esse padrão de observáveis nocauteados.
* A menos que alguém redefina a função
constant
antes de chamá-lafonte
a = constant(10); a(10); // 10
seguido pora = constant(25); a(); //25
, sem erros ou avisos, sem indicação de que sua constante foi quebrada.a
então é alterações ao novo valorcom a "API" nova Object, você pode fazer algo assim:
dê uma olhada nisso no Mozilla MDN para obter mais detalhes. Não é uma variável de primeiro nível, pois está anexada a um objeto, mas se você tiver um escopo, qualquer coisa, poderá anexá-lo a isso.
this
deve funcionar também. Assim, por exemplo, fazer isso no escopo global declarará um valor pseudo-constante na janela (o que é uma péssima idéia, você não deve declarar vars globais descuidadamente)nota: a atribuição retornará o valor atribuído no console, mas o valor da variável não será alterado
fonte
Agrupe constantes em estruturas sempre que possível:
Exemplo, no meu projeto de jogo atual, usei abaixo:
Tarefa:
Comparação:
Mais recentemente, estou usando, para comparação:
O IE11 está com o novo padrão ES6 que possui declaração 'const'.
Acima funciona em navegadores anteriores como IE8, IE9 e IE10.
fonte
Você pode equipar seu script facilmente com um mecanismo para constantes que podem ser definidas, mas não alteradas. Uma tentativa de alterá-los gerará um erro.
fonte
Esqueça o IE e use a
const
palavra - chave.fonte
No entanto, não existe uma maneira predefinida exata para fazer isso entre navegadores; você pode alcançá-lo controlando o escopo das variáveis, como mostrado em outras respostas.
Mas vou sugerir o uso de espaço para nome para distinguir de outras variáveis. isso reduzirá a chance de colisão ao mínimo de outras variáveis.
Espaço de nome apropriado como
então enquanto estiver usando será
iw_constant.name
ouiw_constant.age
Você também pode bloquear a adição de qualquer nova chave ou a alteração de qualquer chave dentro do iw_constant usando o método Object.freeze. No entanto, não é suportado no navegador herdado.
ex:
Para navegadores mais antigos, você pode usar o método polyfill for freeze.
Se você estiver de acordo com a função de chamada a seguir, é melhor definir o modo entre navegadores para definir constante. Escopo seu objeto dentro de uma função auto-executável e retorno de uma função get para suas constantes ex:
// para obter o valor use
iw_constant('name')
ouiw_constant('age')
** Nos dois exemplos, você deve ter muito cuidado com o espaçamento de nomes, para que seu objeto ou função não seja substituído por outra biblioteca (se o objeto ou função em si for substituído, toda a sua constante desaparecerá)
fonte
Por um tempo, especifiquei "constantes" (que na verdade ainda não eram constantes) em literais de objetos passados para
with()
instruções. Eu pensei que era tão inteligente. Aqui está um exemplo:No passado, eu também criei um
CONST
espaço para nome onde colocaria todas as minhas constantes. Mais uma vez, com a sobrecarga. Sheesh.Agora, eu apenas faço
var MY_CONST = 'whatever';
para o Kiss .fonte
with
.Minha opinião (funciona apenas com objetos).
Tentar! Mas entenda - este é um objeto, mas não uma variável simples.
Tente também apenas:
fonte
Eu também tive um problema com isso. E depois de um bom tempo procurando a resposta e analisando todas as respostas de todos, acho que encontrei uma solução viável para isso.
Parece que a maioria das respostas que encontrei está usando funções para manter as constantes. Como muitos usuários dos MUITOS fóruns publicam, as funções podem ser facilmente substituídas por usuários no lado do cliente. Fiquei intrigado com a resposta de Keith Evetts de que o objeto de constantes não pode ser acessado por fora, mas apenas pelas funções internas.
Então, eu vim com esta solução:
Coloque tudo dentro de uma função anônima para que as variáveis, objetos etc. não possam ser alterados pelo lado do cliente. Oculte também as funções 'reais' fazendo com que outras funções chamem as funções 'reais' por dentro. Também pensei em usar funções para verificar se uma função foi alterada por um usuário no lado do cliente. Se as funções foram alteradas, altere-as novamente usando variáveis que são 'protegidas' por dentro e não podem ser alteradas.
Parece também que a segurança é realmente um problema e não há como 'ocultar' sua programação do lado do cliente. Uma boa idéia para mim é compactar seu código para que seja realmente difícil para qualquer pessoa, incluindo você, o programador, ler e entender. Existe um site que você pode acessar: http://javascriptcompressor.com/ . (Este não é o meu site, não se preocupe, não estou anunciando.) Este é um site que permitirá compactar e ofuscar o código Javascript gratuitamente.
fonte
Claramente, isso mostra a necessidade de uma palavra-chave const padronizada entre navegadores.
Mas para agora:
ou
Ambos parecem suficientes e qualquer outra coisa é como atirar uma mosca com uma bazuca.
fonte
Eu uso em
const
vez dosvar
meus scripts Greasemonkey, mas é porque eles serão executados apenas no Firefox ... Aconvenção de nomes também pode ser o caminho a percorrer (eu faço os dois!).
fonte
Em JavaScript, minha prática é evitar constantes o máximo possível e usar cadeias de caracteres. Problemas com constantes aparecem quando você deseja expor suas constantes para o mundo exterior:
Por exemplo, pode-se implementar a seguinte API de data:
Mas é muito mais curto e mais natural simplesmente escrever:
Dessa forma, "dias" e "horas" realmente agem como constantes, porque você não pode mudar externamente quantos segundos "horas" representa. Mas é fácil substituir
MyModule.Date.HOUR
.Esse tipo de abordagem também ajudará na depuração. Se o Firebug diz
action === 18
que é muito difícil descobrir o que isso significa, mas quando você vêaction === "save"
, fica imediatamente claro.fonte
"Hours"
vez de"hours"
- mas um IDE pode informar você desde o início queDate.Hours
não está definido.Ok, isso é feio, mas me dá uma constante no Firefox e no Chromium, uma constante inconstante (WTF?) No Safari e Opera e uma variável no IE.
É claro que eval () é ruim, mas sem ele, o IE gera um erro, impedindo a execução de scripts.
O Safari e o Opera suportam a palavra-chave const, mas você pode alterar o valor da const .
Neste exemplo, o código do lado do servidor está gravando JavaScript na página, substituindo {0} por um valor.
Para que serve isso? Não muito, já que não é entre navegadores. Na melhor das hipóteses, talvez tenha um pouco de tranqüilidade de que pelo menos alguns navegadores não permitam que bookmarklets ou scripts de terceiros modifiquem o valor.
Testado com Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.
fonte
Se vale a pena mencionar, você pode definir constantes em angular usando
$provide.constant()
fonte
Uma versão aprimorada da resposta de Burke que permite que você faça em
CONFIG.MY_CONST
vez deCONFIG.get('MY_CONST')
.Requer o IE9 + ou um navegador da web real.
* As propriedades são somente leitura, apenas se os valores iniciais forem imutáveis.
fonte
O JavaScript ES6 (re) introduziu a
const
palavra - chave suportada em todos os principais navegadores .Além disso,
const
comporta-se de maneira semelhantelet
.Ele se comporta conforme o esperado para tipos de dados primitivos (Boolean, Null, Undefined, Number, String, Symbol):
Atenção: Esteja ciente das armadilhas relacionadas aos objetos:
Se você realmente precisa de um objeto imutável e absolutamente constante: use
const ALL_CAPS
para deixar sua intenção clara. É uma boa convenção seguir todas asconst
declarações de qualquer maneira, portanto, basta confiar nela.fonte
Outra alternativa é algo como:
Então simplesmente:
var foo = constantMap.MY_CONSTANT
Se você
constantMap.MY_CONSTANT = "bar"
aceitasse, isso não teria efeito, pois estamos tentando usar um operador de atribuição com um getter, portantoconstantMap.MY_CONSTANT === "myconstant"
, permaneceria verdadeiro.fonte
em Javascript já existe constantes . Você define uma constante como esta:
Isso não pode mudar através da reatribuição.
fonte
A palavra-chave 'const' foi proposta anteriormente e agora foi oficialmente incluída no ES6. Usando a palavra-chave const, você pode transmitir um valor / string que atuará como uma string imutável.
fonte
A introdução de constantes no JavaScript é, na melhor das hipóteses, um hack.
Uma boa maneira de tornar valores persistentes e acessíveis globalmente em JavaScript seria declarar um objeto literal com algumas propriedades "somente leitura" como esta:
você terá todas as suas constantes agrupadas em um único objeto acessório "meu", onde poderá procurar seus valores armazenados ou qualquer outra coisa que você tenha decidido colocar lá para esse assunto. Agora vamos testar se funciona:
Como podemos ver, a propriedade "my.constant1" preservou seu valor original. Você fez algumas constantes temporárias 'verdes' agradáveis ...
Mas é claro que isso apenas o impedirá de modificar, alterar, anular ou esvaziar acidentalmente o valor constante da sua propriedade com acesso direto, como no exemplo fornecido.
Caso contrário, ainda acho que as constantes são para manequins. E ainda acho que trocar sua grande liberdade por uma pequena parte da segurança enganosa é a pior negociação possível.
fonte
Rhino.js
implementaconst
além do mencionado acima.fonte