Il y a la définition const dans Exploring ES6 du Dr. Axel Rauschmayer:
const
fonctionne comme let, mais la variable que vous déclarez doit être immédiatement initialisé, avec une valeur impossible à modifier ensuite. […]const bar = 123; bar = 456; // TypeError: `bar` is read-only
et puis il écrit
Pitfall: const ne rend pas la valeur immuable
const
signifie seulement qu'une variable a toujours la même valeur, mais cela ne signifie pas que la valeur elle-même est ou devient immuable.
Je suis un peu confus avec ce piège. Quelqu'un peut-il clairement définir la const
avec ce piège?
MDN résume bien:
La déclaration const crée une référence en lecture seule à une valeur. Cela ne signifie pas que la valeur qu'il détient est immuable, mais simplement que l'identificateur de variable ne peut pas être réaffecté. Par exemple, si le contenu est un objet, cela signifie que l’objet lui-même peut toujours être modifié.
Plus succinctement: const crée une liaison immuable.
En d'autres termes: const, comme var, vous donne un bloc de mémoire modifiable dans lequel vous stockez quelque chose. Cependant, const impose de continuer à faire référence à ce même bloc de mémoire - vous ne pouvez pas réaffecter la variable à un bloc de mémoire différent, car la référence à la variable est constante.
Pour que quelque chose soit vraiment constant et immuable après l'avoir déclaré, vous devez utiliser quelque chose comme Object.freeze()
. Cependant, c'est peu profond et ne fonctionne que sur des paires clé/valeur. Geler un objet entier demande un peu plus d'effort. Le faire de manière répétée de manière performante est encore plus difficile. Si vous en avez vraiment besoin, je vous conseillerais de regarder quelque chose comme Immutable.js
Lorsque vous créez quelque chose const
en JavaScript, vous ne pouvez pas réaffecter la variable elle-même pour référencer autre chose. Cependant, la variable peut toujours faire référence à un objet mutable.
const x = {a: 123};
// This is not allowed. This would reassign `x` itself to refer to a
// different object.
x = {b: 456};
// This, however, is allowed. This would mutate the object `x` refers to,
// but `x` itself hasn't been reassigned to refer to something else.
x.a = 456;
Dans le cas de primitives telles que des chaînes et des nombres, const
est plus simple à comprendre, car vous ne modifiez pas les valeurs mais affectez une nouvelle valeur à la variable.
Les déclarations const
et let
déterminent si les rapprochements (ou réaffectations) entre identificateurs et valeurs sont autorisés:
const x = "initial value";
let y = "initial value";
// rebinding/reassignment
try { x = "reassignment" } catch(e) { console.log(x) } // fails
y = "reassignment"; // succeeds
console.log(y);
L’immuabilité est contrôlée au niveau du type. Object
est un type mutable, alors que String
est un type immuable:
const o = {mutable: true};
const x = "immutable";
// mutations
o.foo = true; // succeeds
x[0] = "I"; // fails
console.log(o); // {mutable: true, foo: true}
console.log(x); // immutable
Premièrement, définissez ce qu'est un valeur en js. La valeur peut être: booléens, chaînes, nombres, objets, fonctions et valeurs indéfinies.
J'aime: les gens vous appellent avec votre nom, ça ne change pas. Cependant, vous changez de vêtements. La liaison entre les personnes et vous est votre nom. Le reste peut changer. Désolé pour l'exemple étrange.
Alors, laissez-moi vous donner quelques exemples:
// boolean
const isItOn = true;
isItOn = false; // error
// number
const counter = 0;
counter++; // error
// string
const name = 'edison';
name = 'tesla'; // error
// objects
const fullname = {
name: 'albert',
lastname: 'einstein'
};
fullname = { // error
name: 'werner',
lastname: 'heisenberg'
};
// NOW LOOK AT THIS:
//
// works because, you didn't change the "value" of fullname
// you changed the value inside of it!
fullname.name = 'hermann';
const increase = aNumber => ++aNumber;
increase = aNumber => aNumber + 1; // error
// NOW LOOK AT THIS:
//
// no error because now you're not changing the value
// which is the decrease function itself. function is a
// value too.
let anotherNumber = 3;
const decrease = () => --anotherNumber;
anotherNumber = 10; // no error
decrease(); // outputs 9
const chaos = undefined;
chaos = 'let there be light' // error
const weird = NaN;
weird = 0 // error
Comme vous pouvez le constater, sauf si vous ne modifiez pas la valeur attribuée à "premier" par un const, aucune erreur. Chaque fois que vous essayez de remplacer la première valeur attribuée par un autre paramètre, vous vous fâchez et cela donne une erreur.
C'est donc la deuxième chose que vous savez peut-être en utilisant const
. Qui est, il devrait être initialisé à une valeur sur sa déclaration ou il sera fâché.
const Orphan; // error
const rich = 0; // no error
ES6
/ES2015
const
mot-clé:Le mot clé const
est utilisé pour déclarer une variable de périmètre de bloc (comme pour déclarer avec let
). La différence entre déclarer une variable avec const
et let
est la suivante:
const
ne peut pas être réaffectée .const
doit être assignée quand déclarée . Ceci est une conséquence logique du point précédent car une variable déclarée avec const
ne peut pas être réaffectée, c'est pourquoi nous devons l'affecter exactement une fois lorsque nous déclarons la variable .// we declare variable myVariable
let myVariable;
// first assignment
myVariable = 'First assingment';
// additional assignment
myVariable = 'Second assignment';
// we have to declare AND initialize the variable at the same time
const myConstant = 3.14;
// This will throw an error
myConstant = 12;
Dans l'exemple ci-dessus, nous pouvons observer ce qui suit:
myVariable
déclarée avec let
peut d'abord être déclarée puis assignée.myConstant
déclarée avec const
doit être déclarée et affectée en même temps.myConstant
, nous obtenons l'erreur suivante:Uncaught TypeError: Affectation à une variable constante
const
est toujours modifiable:Une variable déclarée avec const
ne peut tout simplement pas être réaffectée, elle est toujours modifiable . Être modifiable signifie que la structure de données (objet, tableau, carte, etc.) affectée à la variable const
peut toujours être modifiée (c'est-à-dire mutée). Des exemples de mutation sont:
Si vous voulez vraiment qu'un objet ne soit pas mutable, vous devrez utiliser quelque chose comme Object.freeze()
. C'est une méthode qui gèle un objet. Un objet gelé ne peut plus être modifié et aucune nouvelle propriété ne peut être ajoutée.
const obj = {prop1: 1};
obj.prop1 = 2;
obj.prop2 = 2;
console.log(obj);
// We freeze the object here
Object.freeze(obj);
obj.prop1 = 5;
delete obj.prop2;
// The object was frozen and thus not mutated
console.log(obj);