Const en javascript? Cuándo usarlo y si es necesario


Recientemente me he encontrado con el const palabra clave en javascript. Por lo que puedo decir, se utiliza para crear variables inmutables, y he probado para asegurar que no se puede redefinir (en nodo.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 me he dado cuenta de que ciertos desarrolladores / proyectos parecen favorecerlo mucho cuando la palabra clave var podría usarse para el mismo efecto.

Preguntas?

Cuando es apropiado utilizar const en lugar de var?

¿Debe usarse cada vez que se declara una variable que no va a ser reasignada?

¿Realmente hace alguna diferencia si var se usa en lugar de const o viceversa?

Author: Community, 2014-01-20

15 answers

Hay dos aspectos en sus preguntas: cuáles son los aspectos técnicos de usar const en lugar de var y cuáles son los aspectos relacionados con el ser humano de hacerlo.

La diferencia técnica es significativa. En los 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 tiempo de ejecución del código. Motores JavaScript recientes (término usado vagamente) en realidad compilan código JS para mejorar el rendimiento, por lo que el uso de la palabra clave const les informaría de que las optimizaciones descritas anteriormente son posibles y deben hacerse. Esto se traduce en un mejor rendimiento.

El aspecto relacionado con el ser humano es acerca de 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, siempre se debe usar var. Sin embargo, no toda la información que nunca se deben declarar cambios en la vida útil de un programa con const. Si bajo diferentes circunstancias la información debe cambiar, use var para indicarlo, incluso si el cambio real no aparece en su código.

 385
Author: Tibos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-20 15:22:03

2017 Actualización

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-6 el soporte es ahora la norma. Todos los navegadores modernos ahora admiten const por lo que debería ser bastante seguro de usar sin ningún problema.


Respuesta original de 2014

A pesar de tener soporte de navegador bastante decente , evitaría usarlo para ahora. De El artículo de MDN sobre const:

La implementación actual de const es una extensión específica de Mozilla y no es parte de ECMAScript 5. Es compatible con Firefox y Chrome (V8). A partir de Safari 5.1.7 y Opera 12.00, si define una variable con const en estos navegadores, aún puede cambiar su valor más adelante. No es compatible con Internet Explorer 6-10, pero está incluido en Internet Explorer 11. La palabra clave const declara actualmente la constante en el ámbito de la función (como variables declaradas con var).

Luego continúa diciendo:

const va a ser definido por ECMAScript 6, pero con semántica diferente. Al igual que las variables declaradas con la instrucción let, las constantes declaradas con const tendrán un ámbito de bloques.

Si usas const vas a tener que agregar una solución alternativa para soportar navegadores un poco más antiguos.

 66
Author: James Donnelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-10 10:16:18

Para integrar las respuestas anteriores, hay una ventaja obvia en declarar variables constantes, aparte de la razón de rendimiento: si accidentalmente intenta cambiarlas o volver a declararlas en el código, el programa respectivamente no cambiará el valor o lanzará un error.

Por ejemplo, compare:

// Will output 'SECRET'

const x = 'SECRET'
if (x = 'ANOTHER_SECRET') {  // Warning! assigning a value variable in an if condition
    console.log (x)
}

Con:

// Will output 'ANOTHER_SECRET'

var y = 'SECRET'
if (y = 'ANOTHER_SECRET') { 
    console.log (y)
}

O

// Will throw TypeError: const 'x' has already been declared

const x = "SECRET"

/*  complex code */

var x = 0

Con

// Will reassign y and cause trouble

var y = "SECRET"

/*  complex code */

var y = 0
 33
Author: janesconference,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-07 11:15:36

const es no inmutable.

De la MDN:

La declaración const crea una referencia de solo lectura a un valor. Se no significa que el valor que tiene es inmutable, solo que la variable el identificador no se puede reasignar.

 27
Author: Antoine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-25 19:12:41

Para por qué usar const, la respuesta de @Tibos es genial.

Pero usted dijo:

Por lo que puedo decir, se utiliza para crear variables inmutables

Eso es incorrecto. Mutar una variable es diferente de reasignar:

var hello = 'world' // assigning
hello = 'bonjour!' // reassigning

Con const, no puedes hacer eso:

const hello = 'world'
hello = 'bonjour!' // error

Pero puedes mutar tu variable:

const marks = [92, 83]
marks.push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.

Entonces, cualquier proceso que cambie el valor de la variable sin usando el signo = está silenciando.

Nota: +=, por ejemplo, es ... ¡reasignación!

var a = 5
a += 2 // is the same as a = a + 2

Por Lo tanto, la conclusión es: const no impide mutando variables, se evita re-asignación ellos.

 19
Author: math2001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 21:12:03

Usted tiene grandes respuestas, pero vamos a mantenerlo simple.

const debe usarse cuando tenga una constante definida (léase como: no cambiará durante la ejecución de su programa).

Por ejemplo:

const pi = 3.1415926535

Si cree que es algo que puede ser cambiado en una ejecución posterior, use un var.

La diferencia práctica, basada en el ejemplo, es que con const siempre asume que la pi se 3.14[...], es un hecho.

Si lo defines como un var, podría ser 3.14[...] o no.

Para una respuesta más técnica @Tibos tiene razón académicamente.

 9
Author: Edgar Griñant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-20 15:29:19

En mi experiencia uso const cuando quiero establecer algo que puede que desee cambiar más tarde sin tener que buscar en el código bits que han sido codificados de forma rígida, por ejemplo, una ruta de archivo o nombre de servidor.

El error en su prueba es otra cosa, sin embargo, usted está tratando de hacer otra variable llamada x, esto sería una prueba más precisa.

const x = 'const';
x = 'not-const';
 6
Author: Funkotron_King,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-20 15:02:08

Preferencia personal realmente. Usted podría utilizar const cuando, como usted dice, no será reasignado y es constante. Por ejemplo, si quieres asignar tu cumpleaños. Su cumpleaños nunca cambia por lo que podría usarlo como una constante. Pero tu edad cambia, así que podría ser una variable.

 3
Author: Carl Markham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-20 14:59:35

Proporciona: 1) una referencia constante, por ejemplo const x = [] - el array puede ser modificado, pero x no puede apuntar a otro array; y 2) alcance del bloque. const y let reemplazarán juntos a var en ecma6/2015 Ver discusión en https://strongloop.com/strongblog/es6-variable-declarations /

 2
Author: Genovo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-07 12:38:13

Var : Declarar una variable, inicialización de valor opcional.

Let : Declarar una variable local con ámbito de bloque.

Const : Declara una constante con nombre de solo lectura.

Ex:

var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3

let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);

// const c;
// c = 9;   //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.
 2
Author: Srikrushna Pal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 19:59:12

Primero, tres cosas útiles sobre const (aparte de las mejoras de alcance que comparte con let):

  • Documenta para las personas que leen el código más tarde que el valor no debe cambiar.
  • Evita que usted (o cualquier persona que venga después de usted) cambie el valor a menos que regrese y cambie la declaración intencionalmente.
  • It podría guardar el motor JavaScript algunos análisis en términos de optimización. Por ejemplo, has declarado que el valor no se puede cambiar, por lo que el motor no tiene que hacer el trabajo para averiguar si el valor cambia para que pueda decidir si desea optimizar en función del valor que no cambia.

Sus preguntas:

¿Cuándo es apropiado usar const en lugar de var?

Usted puede hacerlo cada vez que esté declarando una variable cuyo valor nunca cambia. Si considera que es apropiado depende completamente de su preferencia / de su equipo preferencia.

¿Debería usarse cada vez que se declara una variable que no va a ser reasignada?

Eso depende de ti / tu equipo.

¿Realmente hace alguna diferencia si var is used in place of const` o viceversa?

Sí:

  • var y const tienen reglas de alcance diferentes. (Usted podría haber querido comparar con let en lugar de var.) Específicamente: const y let son de ámbito de bloques y, cuando se utilizan en el ámbito global, no cree propiedades en el objeto global (aunque sí creen globales). var tiene ámbito global (cuando se usa en ámbito global) o ámbito de función (incluso si se usa en un bloque), y cuando se usa en ámbito global, crea una propiedad en el objeto global.
  • Vea mis "tres cosas útiles" arriba, todas se aplican a esta pregunta.
 1
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-04 08:35:26

Resumen:

Const crea un enlace inmutable lo que significa que el identificador de variable const no es reasignable.

const a = "value1";

No se puede reasignar con

a = "value2";

Sin embargo, si const identifier contiene un objeto o una matriz, su valor se puede cambiar en la medida en que no lo reasignemos.

const x = { a: 1 }

x.a = 2; //is possible and allowed

const numbers = [1, 2];
numbers.push(3); //is possible and allowed

Tenga en cuenta que const es un con un ámbito de bloques al igual que let que no es lo mismo que var (que es un ámbito de funciones)

En en resumen, Cuando algo no es probable que cambie a través de la reasignación use const de lo contrario 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 lo que se puede cambiar a través de la reasignación y lo que no puede ser. Cambiar una const por una let es muy simple. Y ir const por defecto te hace pensar dos veces antes de hacerlo. Y esto es en muchos casos algo bueno.

 1
Author: Tejas Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-21 00:03:50
Main point is that how to decide which one identifier should be used during development.
In java-script here are three identifiers.

1. var (Can re-declared & re-initialize)
2. const (Can't re-declared & re-initialize, can update array values by using push)
3. let (Can re-initialize but can't re-declare)

'var' : En el momento del codding cuando hablamos de código-estándar, generalmente usamos el nombre del identificador, que es fácil de entender por otro usuario/desarrollador. Por ejemplo si estamos trabajando pensamos muchas funciones donde usamos alguna entrada y procesamos esto y devolvemos algún resultado, como:

**Example of variable use**

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2;
 return result;
}

En los ejemplos anteriores, ambas funciones producen resultados diferentes-2 pero usan el mismo nombre de las variables. Aquí podemos ver 'proceso ' y' resultado ' ambos se utilizan como variables y deben ser.

 **Example of constant with variable**

 const tax = 10; 
 const pi = 3.1415926535; 

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

Antes de usar' let 'en java-script tenemos que agregar 'use strict' en la parte superior del archivo js

 **Example of let with constant & variable**

 const tax = 10; 
 const pi = 3.1415926535; 
 let trackExecution = '';

function firstFunction(input1,input2)
{
 trackExecution += 'On firstFunction'; 
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 trackExecution += 'On otherFunction'; # can add current time 
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

 firstFunction();
 otherFunction();
 console.log(trackExecution);

En el ejemplo anterior puede rastrear qué función se ejecuta cuando y cuál función no se usa durante una acción específica.

 1
Author: vinod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-25 11:22:00

'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

 0
Author: Ananda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-15 14:57:52

No soy un experto en el negocio de compilación de JS, pero tiene sentido decir que v8 hace uso de la bandera const

Normalmente a después de declarar y cambiar un montón de variables, la memoria se fragmenta, y v8 se detiene para ejecutar, hace una pausa algún tiempo de unos segundos, para hacer gc, o recolección de basura.

Si se declara una variable con const v8 puede estar seguro de colocarla en un contenedor de tamaño fijo ajustado entre otras variables const, ya que nunca cambio. También puede guardar las operaciones adecuadas para esos tipos de datos, ya que el tipo no cambiará.

 0
Author: Jew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-24 18:03:56