Die Semantik von var
und let
var
und let
sind eine Aussage an die Maschine und an andere Programmierer:
Ich beabsichtige, dass der Wert dieser Zuweisung im Verlauf der Ausführung geändert wird. Verlassen Sie sich nicht auf den eventuellen Wert dieser Zuweisung.
Auswirkungen der Verwendung von var
und let
var
und let
zwingen andere Programmierer dazu, den gesamten dazwischenliegenden Code von der Deklaration bis zur eventuellen Verwendung zu lesen und über den Wert der Zuweisung an diesem Punkt in der Programmausführung nachzudenken.
Sie schwächen das maschinelle Denken für ESLint und andere Sprachdienste, um falsch geschriebene Variablennamen in späteren Zuweisungen zu erkennen und die Wiederverwendung von Variablennamen im äußeren Bereich zu optimieren, wenn der innere Bereich vergisst, sie zu deklarieren.
Sie veranlassen die Laufzeiten auch dazu, viele Iterationen über alle Codepfade durchzuführen, um festzustellen, dass sie tatsächlich, in der Tat, Konstanten sind, bevor sie sie optimieren können. Obwohl dies weniger ein Problem als die Fehlererkennung und die Verständlichkeit für Entwickler ist.
Wann const
verwenden
Wenn sich der Wert der Referenz im Verlauf der Ausführung nicht ändert, ist die richtige Syntax, um die Absicht des Programmierers auszudrücken, const
. Bei Objekten bedeutet die Änderung des Werts der Referenz, dass auf ein anderes Objekt verwiesen wird, da die Referenz unveränderlich ist, das Objekt jedoch nicht.
"const
"-Objekte
Bei Objektreferenzen kann der Zeiger nicht auf ein anderes Objekt geändert werden, aber das erstellte und einer const
-Deklaration zugewiesene Objekt ist veränderlich. Sie können Elemente zu einem mit const
referenzierten Array hinzufügen oder entfernen und Eigenschaftsschlüssel an einem mit const
referenzierten Objekt verändern.
Um unveränderliche Objekte zu erreichen (was Ihren Code wiederum für Menschen und Maschinen einfacher macht), können Sie das Objekt bei der Deklaration/Zuweisung/Erstellung mit Object.freeze
einfrieren, wie folgt:
const Options = Object.freeze(['YES', 'NO'])
Object.freeze hat Auswirkungen auf die Leistung, aber Ihr Code ist wahrscheinlich aus anderen Gründen langsam. Sie sollten ihn testen.
Sie können auch das veränderliche Objekt in eine Zustandsmaschine einschließen und tiefe Kopien als Werte zurückgeben (so funktionieren Redux und React-Status). Siehe Vermeidung von veränderlichem globalen Status in Browser-JS für ein Beispiel, wie man dies von Grund auf aufbaut.
Wann var
und let
gut passen
let
und var
stellen einen veränderlichen Zustand dar. Sie sollten meiner Meinung nach nur verwendet werden, um tatsächlichen veränderlichen Zustand zu modellieren. Dinge wie "ist die Verbindung aktiv?".
Diese sollten am besten in testbaren Zustandsmaschinen gekapselt sein, die konstante Werte freigeben, die "den aktuellen Zustand der Verbindung" repräsentieren, der zu einem beliebigen Zeitpunkt konstant ist und an dem der Rest Ihres Codes tatsächlich interessiert ist.
Das Programmieren ist bereits schwer genug, wenn es um das Komponieren von Nebenwirkungen und die Transformation von Daten geht. Jede Funktion in eine untestbare Zustandsmaschine zu verwandeln, indem man veränderliche Zustände mit Variablen erstellt, erhöht nur die Komplexität.
Für eine nuanciertere Erklärung siehe Vermeide den Mutanten - Argumente für const
.