Die Semantik von var
undlet
var
und let
sind eine Aussage an die Maschine und an andere Programmierer:
Ich beabsichtige, dass sich der Wert dieser Aufgabe im Laufe der Ausführung ändert. Verlassen Sie sich nicht auf den möglichen Wert dieser Aufgabe.
Auswirkungen der Verwendung von var
undlet
var
und let
andere Programmierer zu zwingen, den gesamten dazwischenliegenden Code von der Deklaration bis zur eventuellen Verwendung zu lesen und den Wert der Zuweisung zu diesem Zeitpunkt in der Programmausführung zu begründen.
Sie schwächen die Argumentation der Maschine für ESLint und andere Sprachdienste, um falsch eingegebene Variablennamen in späteren Zuweisungen korrekt zu erkennen, und die Wiederverwendung von Variablennamen des äußeren Bereichs, wenn der innere Bereich die Deklaration vergisst.
Sie führen auch dazu, dass Laufzeiten viele Iterationen über alle Codepfade ausführen, um zu erkennen, dass es sich tatsächlich um Konstanten handelt, bevor sie optimiert werden können. Dies ist zwar weniger problematisch als die Fehlererkennung und die Verständlichkeit für Entwickler.
Wann zu verwenden const
Wenn sich der Wert der Referenz im Laufe der Ausführung nicht ändert, lautet die korrekte Syntax, um die Absicht des Programmierers auszudrücken const
. Bei Objekten bedeutet das Ändern des Referenzwerts, auf ein anderes Objekt zu zeigen, da die Referenz unveränderlich ist, das Objekt jedoch nicht.
" const
" Objekte
Für Objektreferenzen kann der Zeiger nicht auf ein anderes Objekt geändert werden, aber das Objekt , das auf eine erstellt und zugewiesen const
Erklärung ist wandelbar. Sie können Elemente zu einem const
referenzierten Array hinzufügen oder daraus entfernen und Eigenschaftsschlüssel für ein const
referenziertes Objekt mutieren .
Um unveränderliche Objekte zu erhalten (was wiederum dazu führt, dass Ihr Code für Menschen und Maschinen leichter zu verstehen ist), können Sie Object.freeze
das Objekt bei Deklaration / Zuweisung / Erstellung folgendermaßen ausführen :
const Options = Object.freeze(['YES', 'NO'])
Object.freeze wirkt sich zwar auf die Leistung aus, Ihr Code ist jedoch aus anderen Gründen wahrscheinlich langsam. Sie möchten es profilieren.
Sie können das veränderbare Objekt auch in einer Zustandsmaschine kapseln und tiefe Kopien als Werte zurückgeben (so funktionieren Redux- und React-Zustände). Unter Vermeiden eines veränderlichen globalen Status in Browser JS finden Sie ein Beispiel dafür, wie Sie dies aus ersten Prinzipien erstellen können.
Wann var
und let
passen gut zusammen
let
und var
veränderlichen Zustand darstellen. Sie sollten meiner Meinung nach nur zur Modellierung des tatsächlichen veränderlichen Zustands verwendet werden . Dinge wie " Ist die Verbindung lebendig? ".
Diese sind am besten in testbaren Zustandsautomaten eingekapselt, die konstante Werte verfügbar machen , die den " aktuellen Status der Verbindung " darstellen, der zu jedem Zeitpunkt eine Konstante ist und an dem der Rest Ihres Codes tatsächlich interessiert ist.
Das Programmieren ist bereits schwierig genug, um Nebenwirkungen zu komponieren und Daten zu transformieren. Verwandeln Sie jede Funktion in eine nicht testbare Zustandsmaschine, indem Sie einen veränderlichen Zustand mit Variablen erstellen, der nur die Komplexität erhöht.
Eine differenziertere Erklärung finden Sie unter Shun the Mutant - Der Fall fürconst
.