Le mot-clé 'const' ne rend pas la valeur immuable. Qu'est-ce que ça veut dire?

Il y a la définition constante dans Exploring ES6 par Dr. Axel Rauschmayer:

const fonctionne comme let, mais la variable que vous déclarez doit être immédiatement initialisée, avec une valeur qui ne peut être modifiée par la suite . […]

 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 peu confondu avec cet écueil. Quelqu'un peut-il définir clairement la const avec cet écueil?

    MDN le 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, juste que l'identifiant 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 encore être modifié.

    Plus succinctement: const crée une liaison immuable.

    En d'autres termes: const, comme var, vous donne un morceau mutable de mémoire dans lequel vous stockez quelque chose. Cependant, const exige que vous devez toujours vous référer à ce même bloc de mémoire – vous ne pouvez pas réaffecter la variable à un morceau de mémoire différent, car la référence de la variable est constante.

    Pour vraiment faire quelque chose de constant et immobile après que vous l'avez déclaré, vous devez utiliser quelque chose comme Object.freeze() . Cependant, c'est superficiel et fonctionne uniquement sur des paires de clés / valeurs. La congélation d'un objet entier prend un peu plus d'effort. Le faire à plusieurs reprises d'une manière performante est encore plus difficile. Si vous avez vraiment besoin de cela, je recommanderais de vérifier quelque chose comme Immutable.js

    Lorsque vous créez quelque chose en JavaScript, vous ne pouvez pas réaffecter la variable elle-même pour faire référence à 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. xa = 456; 

    Dans le cas de primitives telles que les chaînes et les nombres, const est plus simple à comprendre, puisque vous ne muets pas les valeurs mais plutôt assignez une nouvelle valeur à la variable.

    Rembobinage

    const déclarations const et let contrôlent si les renvois (aka reaffignements) entre les identifiants et les 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); 

    Const signifie: vous ne pouvez pas modifier la valeur assignée initialement.

    D'abord, définissez, qu'est-ce qu'une valeur dans js. La valeur peut être: des booléens, des chaînes, des nombres, des objets, des fonctions et des valeurs indéfinies.

    Comme: Les gens vous appellent avec votre nom, cela ne change pas. Cependant, vous changez vos vêtements. La liaison entre les personnes et vous est votre nom. Le reste peut changer. Désolé pour l'exemple étrange.

    Alors, permettez-moi de 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 voir, à moins que vous ne modifiez pas la "première" valeur attribuée à une const, aucune erreur. Chaque fois que vous essayez de changer la première valeur attribuée à quelque chose d'autre, cela se fâche et cela donne une erreur.

    Donc, c'est la deuxième chose que vous pourriez savoir lors de l'utilisation de const . C'est-à-dire, il devrait être initialisé à une valeur sur sa déclaration ou il sera en colère.

     const orphan; // error const rich = 0; // no error