¿Hay alguna manera de usar constantes en JavaScript ?
Si no, ¿cuál es la práctica común para especificar variables que se usan como constantes?
javascript
constants
fuentesjr
fuente
fuente
Chrome
le permite usar la palabra claveconst
para usar constantes. por ejconst ASDF = "asdf"
. Sin embargo, dadoconst
que no es compatible con varios navegadores, generalmente me quedo con unavar
declaración.try{const thing=1091;}catch(e){var thing=1091;}
trabajos.const
ovar
en absoluto?const
tiene el mismo alcance quevar
, y eso es a nivel de función, no a nivel de bloque. Si sigue el próximo estándar ECMAScript,const
tiene el mismo alcance quelet
, lo que significa que no funcionará.Respuestas:
Desde ES2015 , JavaScript tiene una noción de
const
:Esto funcionará en casi todos los navegadores, excepto IE 8, 9 y 10 . Algunos también pueden necesitar el modo estricto habilitado.
Puede usar
var
convenciones como ALL_CAPS para mostrar que ciertos valores no deben modificarse si necesita admitir navegadores más antiguos o si está trabajando con código heredado:fuente
const
palabra clave. Actualmente es compatible con todos los navegadores modernos, excepto IE.Object.defineProperty
para crear propiedades de solo lectura que tampoco se pueden eliminar. Esto funciona en la versión actual de todos los principales navegadores (pero incorrectamente en IE8 ). Ver la respuesta de @NotANameconst
palabra clave ahora es oficialmente parte del idioma y es compatible con todos los navegadores. De acuerdo con statcounter.com, solo un pequeño porcentaje de usuarios de Internet todavía usa versiones antiguas del navegador que no son compatiblesconst
.¿Estás tratando de proteger las variables contra modificaciones? Si es así, puede usar un patrón de módulo:
Con este enfoque, los valores no pueden modificarse. Pero, debe usar el método get () en CONFIG :(.
Si no necesita proteger estrictamente el valor de las variables, simplemente haga lo sugerido y use una convención de ALL CAPS.
fuente
CONFIG.get = someNewFunctionThatBreaksTheCode
... En general, absolutamente no puede aplicar constantes en JS (sin palabra clave const). Casi lo único que puede hacer es limitar la visibilidad.private
es una palabra reservada para el futuro en JavaScript, no la usaría si fuera usted.La
const
palabra clave se encuentra en el borrador de ECMAScript 6, pero hasta ahora solo cuenta con una pequeña cantidad de compatibilidad con el navegador: http://kangax.github.io/compat-table/es6/ . La sintaxis es:fuente
const
, no arroja ningún error. La asignación simplemente falla y la constante todavía tiene su valor original. Este es un defecto de diseño importante en mi humilde opinión, pero siempre que haya una convención de nomenclatura clara y coherente (como la popular ALL_CAPS), no creo que cause demasiado dolor.'use strict'
.ALL CAPS
?Ver Object.freeze . Puede usarlo
const
si desea que laconstants
referencia también sea de solo lectura.fuente
i
const
declaración ES6 , por ejemplo, las propiedades no se pueden volver a declarar o reasignar, pero si son de tipo de datosobject
, se pueden mutar.const constants
lugar devar constants
evitar que la variable se reasigne.IE admite constantes, más o menos, por ejemplo:
fuente
const
). ¿Puedes explicar qué le pasa?ECMAScript 5 introduce
Object.defineProperty
:Es compatible con todos los navegadores modernos (así como IE ≥ 9).
Ver también: Object.defineProperty en ES5?
fuente
writable: false
será en realidad un error si el código que hace la tarea está siendo interpretado en modo estricto de ECMAScript 5. Solo otra razón para escribir'use strict'
en su código.writable: false
ya que ese es el valor predeterminado .No, no en general. Firefox implementa
const
pero sé que IE no.@John señala una práctica de nomenclatura común para concursos que se ha utilizado durante años en otros idiomas, no veo ninguna razón por la que no pueda usar eso. Por supuesto, eso no significa que alguien no escribirá sobre el valor de la variable de todos modos. :)
fuente
En JavaScript, mi preferencia es usar funciones para devolver valores constantes.
fuente
Los documentos web de Mozillas MDN contienen buenos ejemplos y explicaciones sobre
const
. Extracto:Pero es triste que IE9 / 10 todavía no sea compatible
const
. Y la razón es absurda :¿No lo implementan porque otros navegadores no lo implementaron correctamente? ¿Demasiado miedo de hacerlo mejor? Definiciones de estándares o no, una constante es una constante: establece una vez, nunca cambia.
Y a todas las ideas: cada función se puede sobrescribir (XSS, etc.). Entonces no hay diferencia en
var
ofunction(){return}
.const
Es la única constante real.Actualización: IE11 admite
const
:fuente
Si no te importa usar funciones:
Este enfoque le brinda funciones en lugar de variables regulares, pero garantiza * que nadie puede alterar el valor una vez que se establece.
Personalmente, esto me parece bastante agradable, especialmente después de haberme acostumbrado a este patrón de observables noqueados.
* A menos que alguien redefina la función
constant
antes de que la llamefuente
a = constant(10); a(10); // 10
seguido dea = constant(25); a(); //25
, no hay errores o advertencias, no hay indicios de que su constante se haya roto.a
entonces cambiará a un nuevo valorcon la "nueva" Object api puedes hacer algo como esto:
Eche un vistazo a esto en el MDN de Mozilla para obtener más detalles. No es una variable de primer nivel, ya que está adjunta a un objeto, pero si tiene un alcance, cualquier cosa, puede adjuntarlo a eso.
this
debería funcionar también. Entonces, por ejemplo, hacer esto en el ámbito global declarará un valor pseudo constante en la ventana (lo cual es una muy mala idea, no debe declarar descuidadamente los valores globales)nota: la asignación le devolverá el valor asignado en la consola, pero el valor de la variable no cambiará
fuente
Agrupe las constantes en estructuras donde sea posible:
Ejemplo, en mi proyecto de juego actual, he usado a continuación:
Asignación:
Comparacion:
Más recientemente estoy usando, para comparar:
IE11 es con el nuevo estándar ES6 que tiene una declaración 'const'.
Lo anterior funciona en navegadores anteriores como IE8, IE9 e IE10.
fuente
Puede equipar fácilmente su script con un mecanismo para constantes que se puede establecer pero no alterar. Un intento de alterarlos generará un error.
fuente
Olvídate de IE y usa la
const
palabra clave.fuente
Sin embargo, no existe una forma predefinida exacta de navegador cruzado para hacerlo, puede lograrlo controlando el alcance de las variables como se muestra en otras respuestas.
Pero sugeriré usar el espacio de nombre para distinguirlo de otras variables. Esto reducirá la posibilidad de colisión al mínimo de otras variables.
Espacio de nombres adecuado como
así que mientras se usa será
iw_constant.name
oiw_constant.age
También puede bloquear agregar cualquier clave nueva o cambiar cualquier clave dentro de iw_constant utilizando el método Object.freeze. Sin embargo, no es compatible con el navegador heredado.
ex:
Para navegadores más antiguos, puede usar polyfill para el método de congelación.
Si está de acuerdo con la siguiente función de llamada, es la mejor forma de navegador cruzado para definir constante. Alcanzar su objeto dentro de una función de ejecución automática y devolver una función get para sus constantes, por ejemplo:
// para obtener el valor use
iw_constant('name')
oiw_constant('age')
** En ambos ejemplos, debe tener mucho cuidado con el espaciado de nombres para que su objeto o función no se reemplace a través de otra biblioteca.
fuente
Por un tiempo, especifiqué "constantes" (que todavía no eran realmente constantes) en literales de objetos pasados a las
with()
declaraciones. Pensé que era muy inteligente. Aquí hay un ejemplo:En el pasado, también he creado un
CONST
espacio de nombres donde pondría todas mis constantes. De nuevo, con los gastos generales. SheeshAhora, solo lo hago
var MY_CONST = 'whatever';
a KISS .fuente
with
.Mi opinión (solo funciona con objetos).
¡Tratar! Pero entienda: este es un objeto, pero no una variable simple.
Prueba también solo:
fuente
Yo también he tenido un problema con esto. Y después de bastante tiempo buscando la respuesta y observando todas las respuestas de todos, creo que he encontrado una solución viable para esto.
Parece que la mayoría de las respuestas que he encontrado es usar funciones para mantener las constantes. Como comentan muchos de los usuarios de MUCHOS foros, los usuarios pueden sobrescribir fácilmente las funciones del lado del cliente. La respuesta de Keith Evetts me intrigó de que el exterior no puede acceder al objeto de constantes, sino solo desde las funciones del interior.
Entonces se me ocurrió esta solución:
Ponga todo dentro de una función anónima para que las variables, objetos, etc. no puedan ser cambiados por el lado del cliente. También oculte las funciones 'reales' haciendo que otras funciones llamen a las funciones 'reales' desde adentro. También pensé en usar funciones para verificar si un usuario ha cambiado una función en el lado del cliente. Si se han cambiado las funciones, cámbielas nuevamente usando variables que estén 'protegidas' en el interior y que no se puedan cambiar.
También parece que la seguridad es realmente un problema y no hay forma de "ocultar" su programación desde el lado del cliente. Una buena idea para mí es comprimir su código para que sea realmente difícil para cualquiera, incluido usted, el programador, leerlo y comprenderlo. Hay un sitio al que puede ir: http://javascriptcompressor.com/ . (Este no es mi sitio, no se preocupe, no estoy anunciando). Este es un sitio que le permitirá comprimir y ofuscar el código Javascript de forma gratuita.
fuente
Claramente, esto muestra la necesidad de una palabra clave const estandarizada entre navegadores.
Pero por ahora:
o
Ambos parecen suficientes y cualquier otra cosa es como disparar una mosca con una bazuca.
fuente
Lo uso en
const
lugar devar
en mis scripts de Greasemonkey, pero es porque solo se ejecutarán en Firefox ... Laconvención de nombres también puede ser el camino a seguir (¡hago ambas cosas!).
fuente
En JavaScript, mi práctica ha sido evitar las constantes tanto como puedo y usar cadenas en su lugar. Los problemas con las constantes aparecen cuando desea exponer sus constantes al mundo exterior:
Por ejemplo, uno podría implementar la siguiente API de fecha:
Pero es mucho más corto y más natural simplemente escribir:
De esta manera, los "días" y las "horas" realmente actúan como constantes, porque no puede cambiar desde el exterior cuántos segundos representa "horas". Pero es fácil de sobrescribir
MyModule.Date.HOUR
.Este tipo de enfoque también ayudará en la depuración. Si Firebug te dice
action === 18
que es bastante difícil entender lo que significa, pero cuando lo vesaction === "save"
, está claro de inmediato.fuente
"Hours"
lugar de hacerlo"hours"
, pero un IDE podría informarle desde el principio queDate.Hours
no está definido.De acuerdo, esto es feo, pero me da una constante en Firefox y Chromium, una constante inconstante (WTF?) En Safari y Opera, y una variable en IE.
Por supuesto, eval () es malo, pero sin él, IE arroja un error, evitando que se ejecuten los scripts.
Safari y Opera admiten la palabra clave const, pero puede cambiar el valor de const .
En este ejemplo, el código del lado del servidor está escribiendo JavaScript en la página, reemplazando {0} con un valor.
¿Para qué es bueno esto? No mucho, ya que no es un navegador cruzado. En el mejor de los casos, quizás tenga un poco de tranquilidad de que al menos algunos navegadores no permitirán que los marcadores o los guiones de terceros modifiquen el valor.
Probado con Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.
fuente
Si vale la pena mencionar, puede definir constantes en angular usando
$provide.constant()
fuente
Una versión mejorada de la respuesta de Burke que te permite hacer en
CONFIG.MY_CONST
lugar deCONFIG.get('MY_CONST')
.Requiere IE9 + o un navegador web real.
* Las propiedades son de solo lectura, solo si los valores iniciales son inmutables.
fuente
JavaScript ES6 (re) introdujo la
const
palabra clave que es compatible con todos los principales navegadores .Aparte de eso, se
const
comporta de manera similar alet
.Se comporta como se espera para los tipos de datos primitivos (booleano, nulo, indefinido, número, cadena, símbolo):
Atención: tenga en cuenta las dificultades con respecto a los objetos:
Si realmente necesita un objeto inmutable y absolutamente constante: solo use
const ALL_CAPS
para aclarar su intención. De todosconst
modos, es una buena convención para todas las declaraciones, así que confíe en ella.fuente
Otra alternativa es algo como:
Entonces simplemente:
var foo = constantMap.MY_CONSTANT
Si
constantMap.MY_CONSTANT = "bar"
lo hiciera, no tendría ningún efecto, ya que estamos tratando de usar un operador de asignación con un captador, porconstantMap.MY_CONSTANT === "myconstant"
lo tanto, seguiría siendo cierto.fuente
en Javascript ya existen constantes . Define una constante como esta:
Esto no puede cambiar mediante la reasignación.
fuente
La palabra clave 'const' se propuso anteriormente y ahora se ha incluido oficialmente en ES6. Al usar la palabra clave const, puede pasar un valor / cadena que actuará como una cadena inmutable.
fuente
Introducir constantes en JavaScript es, en el mejor de los casos, un truco.
Una buena manera de hacer valores persistentes y accesibles globalmente en JavaScript sería declarar un objeto literal con algunas propiedades de "solo lectura" como esta:
tendrás todas tus constantes agrupadas en un solo objeto accesorio "mi" donde puedes buscar tus valores almacenados o cualquier otra cosa que hayas decidido poner allí para el caso. Ahora probemos si funciona:
Como podemos ver, la propiedad "my.constant1" ha conservado su valor original. Te has hecho algunas buenas constantes temporales 'verdes' ...
Pero, por supuesto, esto solo lo protegerá de modificar, alterar, anular o vaciar accidentalmente el valor constante de su propiedad con un acceso directo como en el ejemplo dado.
De lo contrario, sigo pensando que las constantes son para tontos. Y sigo pensando que intercambiar su gran libertad por un pequeño rincón de seguridad engañosa es el peor intercambio posible.
fuente
Rhino.js
implementaconst
además de lo mencionado anteriormente.fuente