web-dev-qa-db-fra.com

Const en javascript? Quand l'utiliser et est-ce nécessaire

J'ai récemment rencontré le mot clé const en javascript. D'après ce que je peux dire, il est utilisé pour créer des variables immuables , et j'ai testé pour m'assurer qu'il ne pouvait pas être redéfini (dans node.js):

const x = 'const';
const x = 'not-const';

// Will give an error: 'constant 'x' has already been defined'

Je me rends compte qu'il n'est pas encore normalisé sur tous les navigateurs - mais je ne m'intéresse qu'au contexte de node.js/v8, et j'ai remarqué que certains développeurs/projets semblent le favoriser fortement lorsque le var mot clé pourrait être utilisé dans le même sens.

Des questions?

Quand est-il approprié d'utiliser const à la place de var

Devrait-il être utilisé chaque fois qu'une variable qui ne sera pas réaffectée est déclarée? 

Est-ce que cela fait réellement une différence si var est utilisé à la place de const ou inversement?

299
axdg

Vos questions comportent deux aspects: quels sont les aspects techniques de l’utilisation de const au lieu de var et quels sont les aspects humains de le faire?.

La différence technique est significative. Dans les langages compilés, une constante sera remplacée au moment de la compilation et son utilisation permettra d'autres optimisations, telles que la suppression du code mort, afin d'accroître encore l'efficacité du code à l'exécution. Les moteurs JavaScript récents (termes peu utilisés) compilent en réalité le code JS pour améliorer les performances. Par conséquent, le mot-clé const les informerait que les optimisations décrites ci-dessus sont possibles et doivent être effectuées. Cela se traduit par de meilleures performances.

L'aspect humain concerne la sémantique du mot clé. Une variable est une structure de données contenant des informations susceptibles de changer. Une constante est une structure de données qui contient des informations qui ne changeront jamais. S'il y a place à l'erreur, var devrait toujours être utilisé. Cependant, toutes les informations qui ne changent jamais au cours de la vie d'un programme doivent être déclarées avec const. Si, dans des circonstances différentes, les informations doivent changer, utilisez var pour l'indiquer, même si le changement réel n'apparaît pas dans votre code.

418
Tibos

Mise à jour 2017

Cette réponse reçoit toujours beaucoup d'attention. Il convient de noter que cette réponse a été publiée au début de 2014 et que beaucoup de choses ont changé depuis. Le support ecmascript-6 _ est maintenant la norme. _ { Tous les navigateurs modernes } _ supporte maintenant const, il devrait donc être assez sûr de l'utiliser sans aucun problème.


Réponse originale de 2014

Malgré le support assez décent du navigateur , je ne l’utiliserais pas pour le moment. De article de MDN sur const :

L'implémentation actuelle de const est une extension spécifique à Mozilla et ne fait pas partie de ECMAScript 5. Elle est prise en charge dans Firefox et Chrome (V8). À partir de Safari 5.1.7 et Opera 12.00, si vous définissez une variable avec const dans ces navigateurs, vous pourrez toujours modifier sa valeur ultérieurement. Il n'est pas pris en charge dans Internet Explorer 6-10, mais est inclus dans Internet Explorer 11. Le mot-clé const déclare actuellement la constante dans l'étendue de la fonction (comme les variables déclarées avec var).

Il poursuit ensuite:

const va être défini par ECMAScript 6, mais avec une sémantique différente. Semblables aux variables déclarées avec l'instruction let, les constantes déclarées avec const auront une portée de bloc.

Si vous utilisez const, vous devrez ajouter une solution de contournement pour prendre en charge les navigateurs un peu plus anciens.

68
James Donnelly

Pour intégrer les réponses précédentes, la déclaration des variables constantes présente un avantage évident, mis à part le motif performances: si vous essayez accidentellement de les modifier ou de les reclasser dans le code, le programme ne modifiera pas la valeur et ne générera pas d'erreur.

Par exemple, comparez:

// Will output 'SECRET'

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

avec:

// Will output 'ANOTHER_SECRET'

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

ou

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

const x = "SECRET"

/*  complex code */

var x = 0

avec 

// Will reassign y and cause trouble

var y = "SECRET"

/*  complex code */

var y = 0
36
janesconference

const est pas immuable.

De la MDN :

La déclaration const crée une référence en lecture seule à une valeur. Il ne signifie pas que la valeur qu'il détient est immuable, mais simplement que la variable l'identifiant ne peut pas être réaffecté.

29
Antoine

Pourquoi utiliser const, la réponse de @ Tibos est excellente.

Mais vous avez dit:

D'après ce que je peux dire, il est utilisé pour créer des variables immuables

C'est faux. La mutation d'une variable est différente de la réaffectation:

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

Avec const, vous ne pouvez pas faire ça:

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

Mais vous pouvez muter votre variable:

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

Ainsi, tout processus qui modifie la valeur de la variable sans à l'aide du signe = est mis en sourdine.

Remarque: +=, par exemple, est ... réaffecté!

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

En résumé, la ligne de fond est la suivante: const ne vous empêche pas de muter des variables, cela vous empêche de réaffecter les.

22
math2001

Vous avez d'excellentes réponses, mais restons simples.

const devrait être utilisé lorsque vous avez une constante définie (comme suit: elle ne changera pas pendant l'exécution du programme).

Par exemple:

const pi = 3.1415926535

Si vous pensez que cela peut être modifié lors d'une exécution ultérieure, utilisez une variable var.

La différence pratique, basée sur l'exemple, est qu'avec const, vous supposerez toujours que pi sera 3,14 [...], c'est un fait.

Si vous le définissez comme une var, il pourrait être 3.14 [...] ou non.

Pour une réponse plus technique, @Tibos a théoriquement raison.

10
Edgar Griñant

var : Déclare une variable, initialisation de la valeur optionnelle.

let : Déclare une variable locale avec une portée de bloc.

const : Déclare une constante nommée en lecture seule.

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.
6
Srikrushna Pal

D'après mon expérience, j'utilise const lorsque je veux définir quelque chose que je souhaiterai peut-être modifier ultérieurement sans avoir à parcourir le code à la recherche de bits ayant été codés en dur, par exemple. Un chemin de fichier ou un nom de serveur. 

L'erreur dans vos tests est une autre chose, cependant, vous essayez de créer une autre variable appelée x, ce serait un test plus précis.

const x = 'const';
x = 'not-const';
6
Funkotron_King

Préférence personnelle vraiment. Vous pouvez utiliser const lorsque, comme vous le dites, il ne sera pas réaffecté et est constant. Par exemple, si vous souhaitez attribuer votre anniversaire. Votre anniversaire ne change jamais, vous pouvez donc l'utiliser comme une constante. Mais votre âge change, donc cela pourrait être une variable.

4
Carl Markham

Résumé: 

const crée une liaison immutable, ce qui signifie que l'identificateur de variable const n'est pas réaffectable. 

const a = "value1";

vous ne pouvez pas le réaffecter avec 

a = "value2";

Cependant, si identificateur const contient un objet ou un tableau, sa valeur peut être modifiée dans la mesure où nous ne le réaffectons pas.

const x = { a: 1 }

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

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

Veuillez noter que const est un block-scoped, tout comme let, ce qui n’est pas identique à var (qui est fonctionnel-scoped)

En bref, quand quelque chose n'est pas susceptible de changer lors de la réaffectation, utilisez const, sinon utilisez let ou var en fonction de l'étendue que vous souhaitez avoir.

Il est beaucoup plus facile de raisonner sur le code lorsqu'il est tout à fait évident de savoir ce qui peut être changé par une réaffectation et ce qui ne peut pas être. Changer un const en let est extrêmement simple. Et aller par défaut vous fait réfléchir à deux fois avant de le faire. Et c'est dans de nombreux cas une bonne chose.

2
Tejas Patel

Il fournit: 1) une référence constante, par exemple, const x = [] - le tableau peut être modifié, mais x ne peut pas pointer vers un autre tableau; et 2) bloquer la portée . const et laisser ensemble remplacer var dans ecma6/2015 Voir discussion à https://strongloop.com/strongblog/es6-variable-declarations/

2
Genovo
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': Au moment du codage, lorsque nous parlons de code standard, nous utilisons généralement le nom de l'identifiant, qui est facile à comprendre pour les autres utilisateurs/développeurs. Par exemple, si nous travaillons avec plusieurs fonctions, nous utilisons certaines entrées, nous les traitons et renvoyons des résultats, comme:

**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;
}

Dans les exemples ci-dessus, les deux fonctions produisent des résultats différents mais en utilisant le même nom de variables. Nous pouvons voir ici que 'processus' et 'résultat' sont tous deux utilisés comme variables et qu'ils devraient l'être. 

 **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;
}

Avant d'utiliser 'let' dans le script Java, nous devons ajouter 'use strict' en haut du fichier 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);

Dans l'exemple ci-dessus, vous pouvez savoir quelle fonction a été exécutée quand et laquelle n'a pas été utilisée lors d'une action spécifique.

2
vinod

Premièrement, trois choses utiles à propos de const (autres que les améliorations apportées à la portée avec lesquelles elle partage let):

  • Il documente pour les personnes lisant le code ultérieurement que la valeur ne doit pas changer.
  • Cela vous empêche (ou quiconque viendra après vous) de modifier la valeur, à moins qu'ils ne reviennent en arrière et ne modifient la déclaration intentionnellement.
  • Ilpourraitsauvegarder le moteur JavaScript une analyse en termes d’optimisation. Par exemple, vous avez déclaré que la valeur ne pouvait pas changer, le moteur n'a donc pas à travailler pour déterminer si la valeur change, il peut donc décider de l'optimiser en fonction de l'absence de modification de la valeur.

Vos questions:

Quand est-il approprié d'utiliser const à la place de var?

Vous pouvez le faire chaque fois que vous déclarez une variable dont la valeur ne change jamais. Que vous jugiez cela approprié dépend entièrement de vos préférences/des préférences de votre équipe.

Devrait-il être utilisé chaque fois qu'une variable qui ne sera pas réaffectée est déclarée?

C'est à vous/votre équipe de décider.

Est-ce que cela fait réellement une différence si var is used in place ofconst` ou vice-versa?

Oui:

  • var et const ont des règles de portée différentes. (Vous auriez peut-être voulu comparer avec let plutôt que var.) Plus précisément: const et let ont une portée de bloc et, lorsqu'ils sont utilisés avec une portée globale, ne créez pas de propriétés sur l'objet global (même s'ils créent des objets globaux). var a une portée globale (lorsqu'elle est utilisée dans une portée globale) ou une étendue de fonction (même si elle est utilisée dans un bloc) et, lorsqu'elle est utilisée dans une portée globale, crée une propriété sur l'objet global.
  • Voir mes "trois choses utiles" ci-dessus, elles s'appliquent toutes à cette question.
1
T.J. Crowder

Je ne suis pas un expert dans le domaine de la compilation JS, mais il est logique de dire que v8 utilise le drapeau const.

Normalement, après avoir déclaré et modifié une série de variables, la mémoire est fragmentée et la v8 s’arrête de s’exécuter, fait une pause de quelques secondes pour créer gc ou garbage collection.

si une variable est déclarée avec const v8, vous pouvez être sûr de la placer dans un conteneur de taille fixe étroite entre les autres variables const, car elle ne changera jamais ..____. Elle peut également enregistrer les opérations appropriées pour ces types de données car le type ne changera pas. .

0
Jew