Je sais que ES6 n'est pas encore standardisé, mais un nombreux navigateurs prennent actuellement en charge les const
mots-clés dans JS.
Dans la spécification, il est écrit que:
La valeur d'une constante ne peut pas changer par une réaffectation et une constante ne peut pas être déclarée à nouveau. Pour cette raison, bien qu'il soit possible de déclarer une constante sans l'initialiser, il serait inutile de le faire.
et quand je fais quelque chose comme ça:
const xxx = 6;
xxx = 999;
xxx++;
const yyy = [];
yyy = 'string';
yyy = [15, 'a'];
Je vois que tout va bien xxx
est toujours 6
etyyy
est[]
.
Mais si je le fais yyy.push(6); yyy.push(1);
, mon tableau constant a été changé. En ce moment, c'est [6, 1]
et d'ailleurs je ne peux toujours pas le changer avec yyy = 1;
.
Est-ce un bug ou est-ce que je manque quelque chose? Je l'ai essayé dans le dernier chrome et FF29
la source
Réponses:
La documentation déclare:
Lorsque vous ajoutez à un tableau ou à un objet que vous ne réassignez pas ou ne re-déclarez pas la constante, elle est déjà déclarée et affectée, vous ajoutez simplement à la "liste" vers laquelle pointe la constante.
Donc, cela fonctionne bien:
et ça:
mais ni l'un ni l'autre:
la source
Cela se produit parce que votre constante stocke en fait une référence au tableau. Lorsque vous joignez quelque chose dans votre tableau, vous ne modifiez pas votre valeur constante, mais le tableau vers lequel elle pointe. La même chose se produirait si vous affectiez un objet à une constante et tentiez de modifier l'une de ses propriétés.
Si vous souhaitez figer un tableau ou un objet afin qu'il ne puisse pas être modifié, vous pouvez utiliser la
Object.freeze
méthode, qui fait déjà partie d'ECMAScript 5.la source
five
fixée à 5 n'a pas réellement une valeur de 5, c'est juste une référence au nombre 5. Donc si je le fais,five++
je ne change pas la constante, juste le nombre vers lequel elle pointe.five
pointe la variable (la variablefive
était autrefois une étiquette pour le nombre 5, maintenant elle pointe vers un nombre différent: 6). Dans l'exemple de la question (et de cette réponse),x
pointe toujours vers la même liste; six
est const, vous ne pouvez pas le faire pointer vers une liste différente. La seule différence est que la même liste peut augmenter ou diminuer; c'est quelque chose de possible uniquement pour les tableaux et les objets et non pour les primitifs.C'est un comportement cohérent avec tous les langages de programmation auxquels je peux penser.
Considérez que les tableaux C ne sont que des pointeurs glorifiés. Un tableau constant signifie seulement que la valeur du pointeur ne changera pas - mais en fait, les données contenues à cette adresse sont libres de le faire.
En javascript, vous êtes autorisé à appeler des méthodes d'objets constants (bien sûr - sinon les objets constants ne serviraient pas à grand-chose!) Ces méthodes pourraient avoir pour effet secondaire de modifier l'objet. Puisque les tableaux en javascript sont des objets, ce comportement s'applique également à eux.
Tout ce dont vous êtes assuré, c'est que la constante pointera toujours vers le même objet. Les propriétés de l'objet lui-même sont libres de changer.
la source
En outre, une note également importante:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
la source
Je pense que cela vous donnerait plus de clarté sur la question: https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0 .
En gros, cela revient à
const
pointer toujours vers la même adresse en mémoire. Vous pouvez modifier la valeur stockée dans cette adresse, mais vous ne pouvez pas non plus modifier l'adresseconst
pointée.La définition de
const
vous mentionnée sera vraie lorsque leconst
pointe vers une adresse contenant une valeur primitive. En effet, vous ne pouvez pas attribuer une valeur à celaconst
sans changer son adresse (car c'est ainsi que l'attribution de valeurs primitives fonctionne) et la modification de l'adresse de aconst
n'est pas autorisée.Là où, comme si le
const
pointait sur une valeur non primitive, il est possible de modifier la valeur de l'adresse.la source
J'ai parcouru cet article en cherchant pourquoi j'ai pu mettre à jour un objet même après l'avoir défini comme
const
. Le point ici est donc que ce n'est pas directement l'objet mais les attributs qu'il contient qui peuvent être mis à jour.Par exemple, mon objet ressemble à:
Les réponses ci-dessus ont correctement souligné que c'est l'objet qui est const et non son attribut. Par conséquent, je pourrai mettre à jour l'identifiant ou le nom en faisant:
Mais, je ne pourrai pas mettre à jour l'objet lui-même comme:
la source
Parce que dans const, vous pouvez modifier les valeurs d'un objet, afin que l'objet ne stocke pas réellement les données d'affectation, mais à la place, il pointe vers lui. il y a donc une différence entre les primitives et les objets en Javascript.
la source