const

La déclaration const permet de créer une constante nommée accessible uniquement en lecture. Cela ne signifie pas que la valeur contenue est immuable, uniquement que l'identifiant ne peut pas être réaffecté. Autrement dit la valeur d'une constante ne peut pas être modifiée par des réaffectations ultérieures. Une constante ne peut pas être déclarée à nouveau.

Syntaxe

const nom1 = valeur1 [, nom2 = valeur2 [, ... [, nomN = valeurN]]];
nomN
Le nom de la constante. Ce nom peut être n'importe quel identifiant valide.
valeurN
La valeur à associer à la constante. Cette valeur peut être n'importe quelle expression valide.

Description

Cette déclaration permet de créer une constante qui peut être globale ou locale pour la fonction dans laquelle elle a été déclarée. Les constantes font partie de la portée du bloc (comme les variables définies avec let). Il est nécessaire d'initialiser une constante lors de sa déclaration. Au sein d'une même portée, il est impossible d'avoir une constante qui partage le même nom qu'une variable ou qu'une fonction.

Attention, la déclaration const crée une référence en lecture seule vers une valeur. Cela ne signifie pas que la valeur référencée ne peut pas être modifiée ! Ainsi, si le contenu de la constante est un objet, l'objet lui-même pourra toujours être modifié.

Note : Les aspects liés à la zone morte temporelle s'appliquent également à const.

Exemples

Les instructions suivantes illustrent comment fonctionne cette déclaration. On pourra tester ces instructions dans la console afin d'observer le comportement obtenu :

// On définit ma_fav comme une constante
// et on lui affecte la valeur 7
// Généralement, par convention, les 
// constantes sont en majuscules
const MA_FAV = 7;

// Cette réaffectation lèvera une exception 
MA_FAV = 20;

// affichera 7
console.log("mon nombre favori est : " + MA_FAV);

// toute tentative de redéclaration renvoie une erreur
const MA_FAV = 20;

// le nom ma_fav est réservé par la constante ci-dessus
// cette déclaration échouera donc également
var MA_FAV = 20; 

// cela renvoie également une erreur 
let MA_FAV = 20;


// On notera l'importance de la portée de bloc :
if (MA_FAV === 7) {
  // cela fonctionne sans problème et crée 
  // une nouvelle variable dans cette portée
  const MA_FAV =  20;
  
  // Ici, MA_FAV vaut 20
  console.log("mon nombre préféré est " + MA_FAV);
  
  // L'instruction suivante est remontée dans le
  // contexte global et provoque une erreur !
  var MA_FAV = 20;

}

// MA_FAV vaut toujours 7
console.log("mon nombre favori est " + MA_FAV);

// const nécessite une initialisation
const TOTO; // SyntaxError: missing = in const declaration

// const fonctionne également avec les objects
const monObjet = {"clé": "valeur"};

// Écraser l'objet échouera comme précédemment
monObjet = {"autreClé": "valeur"};

// En revanche, les clés d'un objet ne sont pas
// protégés et on peut donc, de façon valide, avoir 
monObjet.clé = "autreValeur";
// On utilisera Object.freeze() afin qu'un objet soit immuabl

// Il en va de même avec les tableaux 
const mon_tableau = [];
// On peut ajouter des éléments au tableau 
mon_tableau.push("A"); // ["A"]
// Mais on ne peut pas affecter une nouvelle valeur
mon_tableau = ["B"] // lève une exception 

Spécifications

Spécification État Commentaires
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'Déclarations let et const' dans cette spécification.
Standard Définition initiale.
ECMAScript 2017 Draft (ECMA-262)
La définition de 'Déclarations let et const' dans cette spécification.
Projet  

Compatibilité des navigateurs

Fonctionnalité Chrome Firefox (Gecko) Edge Internet Explorer Opera Safari
Support simple 21 36 (36) (Oui) 11 12 5.1
Échec de la réaffectation 20 13 (13) (Oui) 11 ? 10.0
Fonctionnalité Android Chrome pour Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Support simple ? ? ? ? (Oui) 10.0
Échec de la réaffectation ? ? ? ? (Oui) ?

Notes de compatibilité

Dans les versions antérieures de Firefox et de Chrome, et pour Safari 5.1.7 et Opera 12.00, si une variable était définie avec const, il était toujours possible de modifier sa valeur après. Cette déclaration n'est pas supportée dans Internet Explorer 6-10 mais est incluse dans Internet Explorer 11.

Notes spécifiques à Firefox

  • Avant SpiderMonkey 46 (Firefox 46 / Thunderbird 46 / SeaMonkey 2.43), une exception TypeError était levée lors d'une redéclaration (au lieu d'une SyntaxError (bug 1198833).
  • À partir de SpiderMonkey 36 (Firefox 36 / Thunderbird 36 / SeaMonkey 2.33):
    • {const a=1};a lève désormais une exception ReferenceError et ne renvoie plus 1 en raison de la portée de bloc.
    • const a; lève désormais une exception SyntaxError ("missing = in const declaration") : il est nécessaire d'initialiser le contenu de la constante.
    • const a = 1; a = 2; lève désormais une exception SyntaxError ("invalid assignment to const a").

Voir aussi

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : SphinxKnight, gudoy, fscholz, matteodelabre
 Dernière mise à jour par : SphinxKnight,