Recientemente me encontré con la const
palabra clave en JavaScript. Por lo que puedo decir, se usa para crear variables inmutables , y lo he probado para asegurarme de que no se pueda redefinir (en Node.js):
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
Me doy cuenta de que aún no está estandarizado en todos los navegadores, pero solo estoy interesado en el contexto de Node.js V8 , y he notado que ciertos desarrolladores / proyectos parecen favorecerlo mucho cuando la var
palabra clave podría usarse para mismo efecto
Entonces mis preguntas son:
- ¿Cuándo es apropiado usar
const
en lugar devar
? - ¿Debería usarse cada vez que se declara una variable que no se va a reasignar?
- ¿Realmente hace alguna diferencia si
var
se usa en lugar deconst
o viceversa?
Respuestas:
Hay dos aspectos en sus preguntas: cuáles son los aspectos técnicos del uso en
const
lugar devar
y cuáles son los aspectos relacionados con el ser humano al hacerlo.La diferencia técnica es significativa. En lenguajes compilados, una constante será reemplazada en tiempo de compilación y su uso permitirá otras optimizaciones como la eliminación de código muerto para aumentar aún más la eficiencia del código en tiempo de ejecución. Los motores JavaScript recientes (término poco utilizado) realmente compilan el código JS para obtener un mejor rendimiento, por lo que el uso de la palabra clave const les informaría que las optimizaciones descritas anteriormente son posibles y deben hacerse. Esto da como resultado un mejor rendimiento.
El aspecto humano está relacionado con la semántica de la palabra clave. Una variable es una estructura de datos que contiene información que se espera que cambie. Una constante es una estructura de datos que contiene información que nunca cambiará. Si hay margen de error,
var
siempre se debe utilizar. Sin embargo, no toda la información que nunca cambia durante la vida útil de un programa debe declararse conconst
. Si en diferentes circunstancias la información cambia, úselavar
para indicar que, incluso si el cambio real no aparece en su código.fuente
const
los objetos parecen ser mutables, así que no estoy seguro de cuán estricto es realmente el compilador JS. Quizás el modo "usar estricto" también marque la diferencia.const
simplemente evita reasignar la "variable" a otro valor.const a = {}; a = {};
arrojará un error en modo estricto.If there is room for error, var should always be used
. Hoy esto ya no se aplica, con herramientas como ESLint que apuntan a laconst
violación de inmediato.Actualización 2017
Esta respuesta todavía recibe mucha atención. Vale la pena señalar que esta respuesta se publicó a principios de 2014 y mucho ha cambiado desde entonces.ecmascript-6El apoyo es ahora la norma. Todos los navegadores modernos ahora son compatibles,
const
por lo que debería ser bastante seguro de usar sin ningún problema.Respuesta original de 2014
A pesar de tener un soporte de navegador bastante decente , evitaría usarlo por ahora. Del artículo de MDN sobre
const
:Luego continúa diciendo:
Si lo usa
const
, tendrá que agregar una solución alternativa para admitir navegadores ligeramente más antiguos.fuente
Para
const
saber por qué usar , la respuesta de @ Tibos es excelente.Pero tu dijiste:
Eso esta mal . La mutación de una variable es diferente de la reasignación:
Con const, no puedes hacer eso:
Pero puedes mutar tu variable:
Entonces, cualquier proceso que cambie el valor de la variable sin usar el
=
signo está mutando la variable.Nota:
+=
por ejemplo es ... reasignar!Entonces, la conclusión es:
const
no le impide mutar variables, le impide reasignarlas .fuente
=
signo está silenciando" es técnicamente incorrecto. Por ejemplo,const marks=[92,83]; marks[2]=95; console.log(marks)
saldrá[92, 83, 95]
.marks
ha sido mutado, a través del signo igual.const
en el contexto de las matrices (similar al ejemplo que utilizó @chharvey). En el caso deconst countArray = countup(n - 1); countArray.push(n);
laconst
se reasigna cada vez. Entonces, ¿por qué usarconst
y novar
?const countArray
, nunca será reasignado. Todavía puede presionar a la matriz, que cambia sus miembros y longitud, pero no llamamos a eso reasignación. utiliza enconst
lugar delet
ovar
cuando desea evitar la reasignación. Por cierto, si usted no desea permitir la reasignación,let
es casi siempre mejor quevar
.Para integrar las respuestas anteriores, hay una ventaja obvia en declarar variables constantes, además de la razón de rendimiento: si accidentalmente intenta cambiarlas o volver a declararlas en el código, el programa no cambiará el valor ni arrojará un error.
Por ejemplo, compare:
con:
o
con
fuente
const
No es inmutable.De la MDN :
fuente
const
es inmutable. Para objetos y matrices no se puede reasignar, pero se puede cambiar el contenido (por ejemplo, array.push).const
o no no afecta eso.var : declara una variable, inicialización del valor opcional.
let : Declara una variable local con alcance de bloque.
const : declara una constante llamada de solo lectura.
Ex:
fuente
Tienes excelentes respuestas, pero seamos simples.
const
debe usarse cuando tiene una constante definida (leída como: no cambiará durante la ejecución de su programa).Por ejemplo:
Si cree que es algo que se puede cambiar en una ejecución posterior, utilice a
var
.La diferencia práctica, basada en el ejemplo, es que
const
siempre supondrá que pi será 3.14 [...], es un hecho.Si lo define como a
var
, podría ser 3.14 [...] o no.Para una respuesta más técnica, @Tibos tiene razón académica.
fuente
En mi experiencia, uso const cuando quiero configurar algo que quiera cambiar más tarde sin tener que buscar en el código buscando bits que hayan sido codificados, por ejemplo, una ruta de archivo o un nombre de servidor.
Sin embargo, el error en su prueba es otra cosa, está tratando de hacer otra variable llamada x, esta sería una prueba más precisa.
fuente
Preferencia personal realmente. Puede usar const cuando, como usted dice, no se reasignará y es constante. Por ejemplo, si desea asignar su cumpleaños. Su cumpleaños nunca cambia, por lo que podría usarlo como una constante. Pero su edad cambia, por lo que podría ser una variable.
fuente
Resumen:
const crea un enlace inmutable, lo que significa que el identificador de variable const no se puede reasignar.
no puedes reasignarlo con
Sin embargo, si el identificador const contiene un objeto o una matriz, su valor puede cambiarse siempre que no lo reasignemos.
Tenga en cuenta que const tiene un ámbito de bloque como let, que no es lo mismo que var (que tiene un ámbito de función)
En resumen, cuando no es probable que algo cambie a través de la reasignación, use const else use let o var dependiendo del alcance que le gustaría tener.
Es mucho más fácil razonar sobre el código cuando es obvio qué se puede cambiar mediante la reasignación y qué no. Cambiar una constante a una let es muy simple. Y seguir const por defecto te hace pensar dos veces antes de hacerlo. Y esto es en muchos casos algo bueno.
fuente
Proporciona: 1) una referencia constante, por ejemplo, const x = []: la matriz se puede modificar, pero x no puede apuntar a otra matriz; y 2) alcance de bloque. const y let juntos reemplazarán var en ecma6 / 2015 Ver discusión en https://strongloop.com/strongblog/es6-variable-declarations/
fuente
fuente
Primero, tres cosas útiles sobre
const
(además de las mejoras de alcance con las que compartelet
):Tus preguntas:
Usted puede hacerlo en cualquier momento usted está declarando una variable cuyo valor no cambia nunca. Si considera que lo apropiado depende de sus preferencias o las preferencias de su equipo.
Eso depende de usted / su equipo.
Si:
var
yconst
tienen diferentes reglas de alcance. (Es posible que haya querido comparar enlet
lugar de hacerlovar
). Específicamente:const
ylet
tienen un alcance de bloque y, cuando se usan en el ámbito global, no crean propiedades en el objeto global (a pesar de que crean globales).var
tiene alcance global (cuando se usa en alcance global) o alcance de función (incluso si se usa en un bloque), y cuando se usa en alcance global, crea una propiedad en el objeto global.fuente
La semántica de
var
ylet
var
ylet
son una declaración para la máquina y para otros programadores:Implicaciones de usar
var
ylet
var
ylet
obligar a otros programadores a leer todo el código intermedio desde la declaración hasta el uso final, y razonar sobre el valor de la asignación en ese punto de la ejecución del programa.Debilitan el razonamiento de la máquina para que ESLint y otros servicios de idiomas detecten correctamente los nombres de variables mal escritas en asignaciones posteriores y la reutilización del alcance de los nombres de variables de alcance externo donde el alcance interno olvida declarar.
También hacen que los tiempos de ejecución ejecuten muchas iteraciones en todas las rutas de código para detectar que en realidad son, de hecho, constantes, antes de poder optimizarlas. Aunque esto es menos problemático que la detección de errores y la comprensión del desarrollador.
Cuándo usar
const
Si el valor de la referencia no cambia en el transcurso de la ejecución, la sintaxis correcta para expresar la intención del programador es
const
. Para los objetos, cambiar el valor de la referencia significa apuntar a otro objeto, ya que la referencia es inmutable, pero el objeto no."
const
" objetosPara referencias de objeto, el puntero no se puede cambiar a otro objeto, pero el objeto que se crea y se asigna a una
const
declaración es mutable. Puede agregar o eliminar elementos de unaconst
matriz a la que se hace referencia y mutar claves de propiedad en unconst
objeto referenciado.Para lograr objetos inmutables (que de nuevo, hacen que su código sea más fácil de razonar para humanos y máquinas), puede hacer
Object.freeze
el objeto en la declaración / asignación / creación, de esta manera:Object.freeze tiene un impacto en el rendimiento, pero su código probablemente sea lento por otras razones. Quieres perfilarlo.
También puede encapsular el objeto mutable en una máquina de estado y devolver copias profundas como valores (así es como funcionan los estados de Redux y React). Consulte Evitar el estado global mutable en Browser JS para ver un ejemplo de cómo construir esto desde los primeros principios.
Cuando
var
ylet
son un buen partidolet
yvar
representan estado mutable. En mi opinión, solo deberían usarse para modelar el estado mutable real . Cosas como "¿ está viva la conexión? ".Estos se encapsulan mejor en máquinas de estado comprobables que exponen valores constantes que representan " el estado actual de la conexión ", que es una constante en cualquier momento, y en lo que está realmente interesado el resto del código.
La programación ya es bastante difícil con la composición de efectos secundarios y la transformación de datos. Convertir cada función en una máquina de estado no comprobable creando un estado mutable con variables que solo acumulan la complejidad.
Para una explicación más matizada, vea Shun the Mutant - The case for
const
.fuente
'const' es una indicación a su código de que el identificador no será reasignado. Este es un buen artículo sobre cuándo usar 'const', 'let' o 'var' https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.ukgxpfhao
fuente
No soy un experto en el negocio de compilación de JS, pero tiene sentido decir que v8 hace uso de la bandera constante
Normalmente, después de declarar y cambiar un montón de variables, la memoria se fragmenta y v8 se detiene para ejecutarse, hace una pausa de unos segundos para hacer gc o recolección de basura.
Si una variable se declara con const v8, puede confiar en colocarla en un contenedor de tamaño fijo ajustado entre otras variables const, ya que nunca cambiará. También puede guardar las operaciones adecuadas para esos tipos de datos, ya que el tipo no cambiará.
fuente
Cuando se trata de la decisión entre let y const , siempre prefiera const para que el uso sea claro en el código. De esa manera, si intenta redeclarar la variable, obtendrá un error. Si no hay otra opción más que redeclararlo, simplemente cambie para alquilar . Tenga en cuenta que, como dice Anthony , los valores no son inmutables (por ejemplo, un objeto const puede tener propiedades mutadas).
Cuando se trata de var , dado que ES6 está fuera, nunca lo usé en el código de producción y no puedo pensar en un caso de uso para él. Sin embargo, tenga en cuenta que las variables declaradas con var no tienen alcance de bloque.
fuente