J'ai écrit beaucoup de code ES6 pour io.js récemment. Il n’ya pas beaucoup de code dans la nature à apprendre, alors j’ai l’impression de définir mes propres conventions au fur et à mesure.
Ma question est quand utiliser const
vs let
.
J'ai appliqué cette règle: si possible, utilisez const
. Utilisez uniquement let
si vous savez que sa valeur doit changer. (Vous pouvez toujours revenir en arrière et changer un const
en un let
s'il s'avère que vous devez changer sa valeur plus tard.)
La principale raison de cette règle est qu'il est facile à appliquer de manière cohérente. Il n'y a pas de zones grises.
En réalité, lorsque j’applique cette règle, en pratique, 95% de mes déclarations le sont const
. Et cela me semble bizarre. Je n'utilise que let
pour des choses comme i
dans une for
boucle, ou occasionnellement pour des choses comme les totaux accumulés de Fibonacci (qui ne sont pas très fréquents dans la vie réelle). Cela m'a surpris - il s'avère que 95% des «variables» dans mon code ES5 à ce jour étaient pour des valeurs qui ne varient pas. Mais voir const
partout dans mon code me semble mal.
Ma question est donc la suivante: est-il acceptable d’utiliser const
autant? Devrais-je vraiment faire des choses comme const foo = function () {...};
?
Ou devrais-je réserver const
pour ce genre de situations où vous codez en dur un littéral en haut d'un module - le genre que vous faites en majuscules, comme const MARGIN_WIDTH = 410;
?
la source
const
autant.function foo() {...}
est meilleur que<anything> foo = function() {...}
function foo() {...}
peut entraîner une confusion mineure lors du débogage, en raison du levage. De plus, son existence signifie que nous avons deux constructions qui font la même chose, mais que l’une d’elles ne fonctionne que dans un contexte très spécifique. (Vous pouvez utiliser une expression de fonction n'importe où une expression peut exister, mais vous ne pouvez utiliser qu'une déclaration de fonction au niveau de l'instruction.) Si vous préférez être bref, le problème pourrait simplement être que la syntaxe de l'expression de fonction utilise l'intégralité du motfunction
.Réponses:
Ma réponse ici n'est pas spécifique à javascript.
En règle générale, dans toute langue qui me permet de le faire de manière semi-facile, je dirais que vous devez toujours utiliser const / final / readonly / quel que soit le nom utilisé dans votre langue, lorsque cela est possible. La raison est simple, il est beaucoup plus facile de raisonner sur le code lorsqu'il est évident de savoir ce qui peut changer et ce qui ne peut pas changer. Et en plus de cela, dans de nombreuses langues, vous pouvez obtenir un support d’outil vous indiquant que vous faites quelque chose de mal lorsque vous affectez accidentellement une variable que vous avez déclarée comme const.
Revenir en arrière et changer un const en un 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.
Combien de bugs avez-vous vu impliquant des variables changeant de manière inattendue? J'imagine beaucoup. Je sais que la majorité des bogues que je vois impliquent des changements d'état inattendus. Vous ne vous débarrasserez pas de tous ces bugs en utilisant généreusement const, mais vous vous débarrasserez de beaucoup d'entre eux!
En outre, de nombreux langages fonctionnels ont des variables immuables où toutes les variables sont constantes par défaut. Regardez Erlang par exemple ou F #. Le codage sans affectation fonctionne parfaitement dans ces langues et est l’une des nombreuses raisons pour lesquelles les gens aiment la programmation fonctionnelle. Il y a beaucoup à apprendre de ces langages sur la gestion d'état afin de devenir un meilleur programmeur.
Et tout commence par être extrêmement libéral avec const! ;) Il ne reste plus que deux personnages à écrire, alors allez-y et
const
tout le reste!la source
const
est deux personnages de plus quelet
...val
dans Scala (qui déclare une variable immuable) et à n’utiliser quevar
(l’équivalent mutable) lorsque nous ne pouvons pas utiliserval
. En d'autres termes, nous déclarons les variables immuables par défaut et n'introduisons la mutabilité que lorsque nous en avons absolument besoin (ce qui peut être simplement dû au fait que l'approche mutable est plus propre).Soyez prudent, car les
const
clés d'objet sont mutables.De là: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
Considérons cet exemple:
Même chose pour les tableaux:
Je n'ai pas encore décidé moi-même, mais j'envisage d'utiliser
const
pour tous les non-tableaux / non-objets etlet
pour les objets / les tableaux.la source
const
.colors = numbers
ne fonctionnera pas, comme prévu. Si vous souhaitez protéger les propriétés de votre objet, vous pouvez utiliserObject.freeze()
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…const moment = require('moment')
, à moins que vous ne soyez du genre à craindre que quelqu'un essaie de le fairemoment = dead.fish(() => pizza)
plus tard.moment = Date.now()
. Mais dans tous les cas, si le code suppose un invariant, je ne vois aucun mal à l’appliquer lorsque cela est possible.Ne t'inquiète pas pour ça.
const
est un ajout étonnant à JavaScript, et je vous recommanderais de l’utiliser dans tous les endroits où cela fait sens. Cela rend le code plus robuste.En ce qui concerne les objets,
const
protégera votre variable contre la réaffectation, mais si vous avez besoin d’objets immuables, vous aurez besoin de laObject.freeze
méthode, voir ci-dessous.const
protégera uniquement contre la réaffectation, et lafreeze
méthode protégera toutes les propriétés immédiates. Si vous souhaitez que toutes les propriétés imbriquées soient également immuables, vous devez les récursivementfreeze
.la source
Object.freeze
c'est peu profond.Dans mon ES6
const
n’est pas une question d’immutabilité , j’explique ce queconst
signifie exactement selon les spécifications.Sur la base de ces faits objectifs, voici ma préférence personnelle:
Aussi subjectif que cela puisse être, c'est un fait que cela correspond le mieux à l'intention de la spécification.
Les personnes qui utilisent
let
par défaut traitent généralement lesconst
variables comme des constantes (ce qu'elles ne sont pas nécessairement, à dessein!). À chacun son goût, mais je préfère utiliser les choses pour les buts pour lesquels elles ont été conçues, et non pour des raisons inventées que les gens attribuent en se basant sur un malentendu.Utiliser
const
uniquement pour les constantes revient à utiliser l'<aside>
élément HTML uniquement pour le contenu de la barre latérale.la source
const
si ce n'est pas constant?const
n'est pas pour ça . Avez-vous lu ce qui précède?const
Est qu'il s'appelleconst
. C'est un nom idiot (en javascript) qui confond beaucoup de développeurs (tous?) Au début. IMO serait mieux si onconst
m'avait appelélet
(surtout parce quelet
c'est plus court maisconst
beaucoup plus commun) etlet
qu'on appelle autre chose.Mon approche personnelle, pensée pour aider à la lisibilité et à la compréhension du code:
let
ne concerne que les variables à vie courte, définies sur une seule ligne et non modifiées après. Généralement, les variables qui ne sont là que pour diminuer le nombre de saisies. Par exemple:const
pour tous les noms connus pour être constants sur tout le module. Non compris les valeurs constantes localement. Dansvalue
l'exemple ci-dessus, par exemple, la portée est constante et elle peut être déclarée avecconst
, mais comme il existe de nombreuses itérations et que, pour chacune d'entre elles, il existe une valeur du même nom , "valeur", qui pourrait amener le lecteur à penser qu'ilvalue
est toujours le même. Les modules et les fonctions sont le meilleur exemple deconst
variables:var
pour tout ce qui peut ou non être variable. Les noms qui peuvent confondre les lecteurs du code, même s’ils sont constants localement et qu’ils ne conviennent paslet
(c’est-à-dire qu’ils ne sont pas complétés dans une simple déclaration directe), demandent à être déclarés avecvar
. Par exemple:Autres commentaires et futures mises à jour possibles ici .
la source
JavaScript est un peu spécial en ce que les variables peuvent être des fonctions et autres, mais considérons en C #, Java ou un autre langage de style C similaire:
C'est
const
étrange, et c'est parce que les déclarations de méthode dans ces langages ne peuvent pas changer, une fois qu'elles sont compilées dans quelque chose d'autre, c'est ce qu'elles font, peu importe ce qui se passe (en ignorant quelques horribles piratages pouvant exister).Pourquoi JavaScript devrait-il être différent? Donc, ce n'est pas compilé, mais cela ne signifie pas que nous devrions jeter la sécurité que les compilateurs peuvent fournir. L'utilisation du
const
mot clé nous donne plus de sécurité, ce qui conduira sûrement à des applications plus robustes.la source