La sémantique de var
etlet
var
et let
sont une déclaration à la machine et aux autres programmeurs:
J'ai l'intention que la valeur de cette affectation change au cours de l'exécution. Ne vous fiez pas à la valeur éventuelle de cette mission.
Implications de l'utilisation var
etlet
var
et let
forcer les autres programmeurs à lire tout le code intermédiaire de la déclaration à l'utilisation finale, et à raisonner sur la valeur de l'affectation à ce stade de l'exécution du programme.
Ils affaiblissent le raisonnement de la machine pour qu'ESLint et d'autres services de langage détectent correctement les noms de variables mal typés dans les affectations ultérieures et la réutilisation de la portée des noms de variables de la portée externe où la portée interne oublie de déclarer.
Ils entraînent également l'exécution de nombreuses itérations sur tous les chemins de code pour détecter qu'elles sont en fait des constantes avant de pouvoir les optimiser. Bien que ce soit moins un problème que la détection de bogues et la compréhensibilité des développeurs.
Quand utiliser const
Si la valeur de la référence ne change pas au cours de l'exécution, la syntaxe correcte pour exprimer l'intention du programmeur est const
. Pour les objets, changer la valeur de la référence signifie pointer vers un autre objet, car la référence est immuable, mais l'objet ne l'est pas.
" const
" objets
Pour les références d'objet, le pointeur ne peut pas être changé en un autre objet, mais l'objet qui est créé et affecté à une const
déclaration est modifiable. Vous pouvez ajouter ou supprimer des éléments d'un const
tableau référencé et muter les clés de propriété sur un const
objet référencé.
Pour réaliser des objets immuables (ce qui, encore une fois, rend votre code plus facile à raisonner pour les humains et les machines), vous pouvez Object.freeze
l'objet à la déclaration / affectation / création, comme ceci:
const Options = Object.freeze(['YES', 'NO'])
Object.freeze a un impact sur les performances, mais votre code est probablement lent pour d'autres raisons. Vous voulez le profiler.
Vous pouvez également encapsuler l'objet modifiable dans une machine à états et renvoyer des copies complètes sous forme de valeurs (c'est ainsi que fonctionnent les états Redux et React). Voir Éviter un état global mutable dans Browser JS pour un exemple de la façon de construire cela à partir des premiers principes.
Quand var
et let
sont un bon match
let
et var
représentent un état mutable. Ils ne devraient, à mon avis, être utilisés que pour modéliser un état mutable réel . Des choses comme " la connexion est-elle vivante? ".
Celles-ci sont mieux encapsulées dans des machines à états testables qui exposent des valeurs constantes qui représentent " l'état actuel de la connexion ", qui est une constante à tout moment, et ce qui intéresse réellement le reste de votre code.
La programmation est déjà assez difficile avec la composition des effets secondaires et la transformation des données. Transformer chaque fonction en une machine à états non testable en créant un état mutable avec des variables ne fait qu'accroître la complexité.
Pour une explication plus nuancée, voir Shun the Mutant - The case forconst
.