Ich bin kürzlich auf das const
Schlüsselwort in JavaScript gestoßen. Soweit ich weiß, wird es verwendet, um unveränderliche Variablen zu erstellen , und ich habe getestet, um sicherzustellen, dass es nicht neu definiert werden kann (in Node.js):
const x = 'const';
const x = 'not-const';
// Will give an error: 'constant 'x' has already been defined'
Mir ist klar, dass es noch nicht für alle Browser standardisiert ist - aber ich interessiere mich nur für den Kontext von Node.js V8 , und ich habe festgestellt, dass bestimmte Entwickler / Projekte es stark zu bevorzugen scheinen, wenn das var
Schlüsselwort für das verwendet werden könnte gleicher Effekt.
Meine Fragen sind also:
- Wann ist es angebracht,
const
anstelle von zu verwendenvar
? - Sollte es jedes Mal verwendet werden, wenn eine Variable deklariert wird, die nicht neu zugewiesen werden soll?
- Macht es tatsächlich einen Unterschied, ob
var
es anstelle vonconst
oder umgekehrt verwendet wird?
Antworten:
Ihre Fragen haben zwei Aspekte: Was sind die technischen Aspekte der Verwendung
const
anstelle vonvar
und was sind die menschenbezogenen Aspekte dabei?Der technische Unterschied ist erheblich. In kompilierten Sprachen wird eine Konstante zur Kompilierungszeit ersetzt, und ihre Verwendung ermöglicht andere Optimierungen wie das Entfernen von totem Code, um die Laufzeiteffizienz des Codes weiter zu erhöhen. Neuere (lose verwendete) JavaScript-Engines kompilieren tatsächlich JS-Code, um eine bessere Leistung zu erzielen. Wenn Sie also das Schlüsselwort const verwenden, werden Sie darüber informiert, dass die oben beschriebenen Optimierungen möglich sind und durchgeführt werden sollten. Dies führt zu einer besseren Leistung.
Der menschenbezogene Aspekt betrifft die Semantik des Schlüsselworts. Eine Variable ist eine Datenstruktur, die Informationen enthält, deren Änderung erwartet wird. Eine Konstante ist eine Datenstruktur, die Informationen enthält, die sich niemals ändern. Wenn es Raum für Fehler gibt,
var
sollte immer verwendet werden. Es müssen jedoch nicht alle Informationen deklariert werden, die sich während der Laufzeit eines Programms nie ändernconst
. Wenn sich die Informationen unter anderen Umständen ändern sollten,var
geben Sie dies an, auch wenn die tatsächliche Änderung nicht in Ihrem Code angezeigt wird.quelle
const
Objekte scheinen veränderlich zu sein, daher bin ich mir nicht sicher, wie streng der JS-Compiler wirklich ist. Vielleicht macht der Modus "Streng verwenden" auch einen Unterschied.const
verhindert nur, dass die "Variable" einem anderen Wert neu zugewiesen wird.const a = {}; a = {};
wird im strengen Modus einen Fehler auslösen.If there is room for error, var should always be used
. Heute gilt dies nicht mehr, da Tools wie ESLint sofort aufconst
Verstöße hinweisen .Update 2017
Diese Antwort erhält immer noch viel Aufmerksamkeit. Es ist erwähnenswert, dass diese Antwort Anfang 2014 veröffentlicht wurde und sich seitdem viel geändert hat.Ecmascript-6Unterstützung ist jetzt die Norm. Alle modernen Browser unterstützen jetzt,
const
so dass die Verwendung ohne Probleme ziemlich sicher sein sollte.Ursprüngliche Antwort von 2014
Trotz ziemlich guter Browserunterstützung würde ich es vorerst vermeiden, es zu verwenden. Aus dem Artikel
const
von MDN über :Dann heißt es weiter:
Wenn Sie verwenden, müssen
const
Sie eine Problemumgehung hinzufügen, um etwas ältere Browser zu unterstützen.quelle
Denn warum verwenden
const
, @ TIBOS Antwort ist großartig.Aber du hast gesagt:
Das ist falsch . Das Mutieren einer Variablen unterscheidet sich vom Neuzuweisen:
Mit const können Sie das nicht tun:
Sie können Ihre Variable jedoch mutieren:
Jeder Prozess, der den Wert der Variablen ändert, ohne das
=
Vorzeichen zu verwenden, mutiert die Variable.Hinweis:
+=
Zum Beispiel ist ... Neuzuweisung!Das Fazit lautet also:
const
hindert Sie nicht daran, Variablen zu mutieren , sondern daran, sie neu zuzuweisen .quelle
=
Vorzeichen zu verwenden, wird stummgeschaltet" ist technisch falsch.const marks=[92,83]; marks[2]=95; console.log(marks)
Wird zum Beispiel ausgegeben[92, 83, 95]
.marks
wurde über Gleichheitszeichen mutiert.const
im Kontext von Arrays zu verstehen (ähnlich dem verwendeten Beispiel @chharvey). Im Falleconst countArray = countup(n - 1); countArray.push(n);
derconst
wird jedes Mal neu zugewiesen. Warum also verwendenconst
und nichtvar
?const countArray
, wird es nie neu zugewiesen. Sie können weiterhin auf das Array pushen, das seine Elemente und Länge ändert, aber wir nennen das keine Neuzuweisung. Sie verwendenconst
anstelle vonlet
oder,var
wenn Sie eine Neuzuweisung verhindern möchten. BTW , wenn Sie keine Neuzuweisung zulassen möchten,let
ist fast immer besser alsvar
.Um die vorherigen Antworten zu integrieren, gibt es einen offensichtlichen Vorteil beim Deklarieren konstanter Variablen, abgesehen vom Leistungsgrund: Wenn Sie versehentlich versuchen, sie im Code zu ändern oder erneut zu deklarieren, ändert das Programm den Wert nicht und gibt keinen Fehler aus.
Vergleichen Sie zum Beispiel:
mit:
oder
mit
quelle
const
ist nicht unveränderlich.Aus dem MDN :
quelle
const
ist unveränderlich. Für Objekte und Arrays kann es nicht neu zugewiesen werden, aber der Inhalt kann geändert werden (z. B. array.push).const
oder nicht, hat keinen Einfluss darauf.var : Deklariert eine Variable, Wertinitialisierung optional.
let : Deklariert eine lokale Variable mit Blockbereich.
const : Deklariert eine schreibgeschützte benannte Konstante.
Ex:
quelle
Sie haben gute Antworten, aber lassen Sie es uns einfach halten.
const
sollte verwendet werden, wenn Sie eine definierte Konstante haben (lesen Sie als: sie ändert sich während Ihrer Programmausführung nicht).Zum Beispiel:
Wenn Sie der Meinung sind, dass dies bei einer späteren Ausführung geändert werden kann, verwenden Sie a
var
.Der praktische Unterschied, basierend auf dem Beispiel, ist, dass bei
const
Ihnen immer angenommen wird, dass pi 3,14 [...] sein wird, es ist eine Tatsache.Wenn Sie es als definieren
var
, kann es 3.14 [...] sein oder nicht.Für eine technischere Antwort ist @Tibos akademisch richtig.
quelle
Nach meiner Erfahrung verwende ich const, wenn ich etwas festlegen möchte, das ich später ändern möchte, ohne den Code nach fest codierten Bits durchsuchen zu müssen, z. B. nach einem Dateipfad oder einem Servernamen.
Der Fehler bei Ihren Tests ist jedoch eine andere Sache. Sie versuchen, eine andere Variable namens x zu erstellen. Dies wäre ein genauerer Test.
quelle
Persönliche Vorlieben wirklich. Sie können const verwenden, wenn es, wie Sie sagen, nicht neu zugewiesen wird und konstant ist. Zum Beispiel, wenn Sie Ihren Geburtstag zuweisen möchten. Ihr Geburtstag ändert sich nie, sodass Sie ihn als Konstante verwenden können. Ihr Alter ändert sich jedoch, sodass dies eine Variable sein kann.
quelle
Zusammenfassung:
const erstellt eine unveränderliche Bindung, was bedeutet, dass der const-Variablenbezeichner nicht neu zugewiesen werden kann.
Sie können es nicht mit neu zuweisen
Wenn der const-Bezeichner jedoch ein Objekt oder ein Array enthält, kann der Wert geändert werden, sofern wir es nicht neu zuweisen.
Bitte beachten Sie, dass const genau wie let ein Blockbereich ist, der nicht mit var identisch ist (der Funktionsbereich hat).
Kurz gesagt, wenn sich durch eine Neuzuweisung wahrscheinlich nichts ändert, verwenden Sie const, andernfalls let oder var, je nachdem, welchen Bereich Sie haben möchten.
Es ist viel einfacher, über den Code nachzudenken, wenn absolut klar ist, was durch Neuzuweisung geändert werden kann und was nicht. Das Ändern einer Konstante in eine Let ist denkbar einfach. Wenn Sie standardmäßig const verwenden, müssen Sie vorher zweimal überlegen. Und das ist in vielen Fällen eine gute Sache.
quelle
Es bietet: 1) eine konstante Referenz, z. B. const x = [] - das Array kann geändert werden, aber x kann nicht auf ein anderes Array zeigen; und 2) Block Scoping. const und let ersetzen gemeinsam var in ecma6 / 2015 Siehe Diskussion unter https://strongloop.com/strongblog/es6-variable-declarations/
quelle
quelle
Zunächst drei nützliche Dinge
const
(abgesehen von den Verbesserungen des Anwendungsbereichslet
):Deine Fragen:
Sie können dies jederzeit tun, wenn Sie eine Variable deklarieren, deren Wert sich nie ändert. Ob Sie dies für angemessen halten, hängt ganz von Ihren Vorlieben / den Vorlieben Ihres Teams ab.
Das liegt an Ihnen / Ihrem Team.
Ja:
var
undconst
haben unterschiedliche Geltungsbereichsregeln. (Möglicherweise wollten Sie eher mit vergleichenlet
als mitvar
.) Insbesondere:const
undlet
haben einen Blockbereich und erstellen bei Verwendung im globalen Bereich keine Eigenschaften für das globale Objekt (obwohl sie globale Werte erstellen).var
hat entweder einen globalen Bereich (bei Verwendung im globalen Bereich) oder einen Funktionsbereich (auch wenn er in einem Block verwendet wird) und erstellt bei Verwendung im globalen Bereich eine Eigenschaft für das globale Objekt.quelle
Die Semantik von
var
undlet
var
undlet
sind eine Aussage an die Maschine und an andere Programmierer:Auswirkungen der Verwendung von
var
undlet
var
undlet
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
" ObjekteFü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 einemconst
referenzierten Array hinzufügen oder daraus entfernen und Eigenschaftsschlüssel für einconst
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 :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
undlet
passen gut zusammenlet
undvar
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ür
const
.quelle
'const' ist ein Hinweis auf Ihren Code, dass die Kennung nicht neu zugewiesen wird. Dies ist ein guter Artikel darüber, wann 'const', 'let' oder 'var' verwendet werden soll. Https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.ukgxpfhao
quelle
Ich bin kein Experte im JS-Kompilierungsgeschäft, aber es ist sinnvoll zu sagen, dass v8 das const-Flag verwendet
Normalerweise wird der Speicher nach dem Deklarieren und Ändern einer Reihe von Variablen fragmentiert, und v8 wird angehalten, um ausgeführt zu werden, macht einige Sekunden Pause, um gc oder Garbage Collection durchzuführen.
Wenn eine Variable mit const v8 deklariert wird, kann sie sicher in einen engen Container mit fester Größe zwischen anderen const-Variablen gestellt werden, da sie sich nie ändert. Es kann auch die richtigen Operationen für diese Datentypen speichern, da sich der Typ nicht ändert.
quelle
Wenn es um die Entscheidung zwischen let und const geht , bevorzugen Sie immer const, damit die Verwendung im Code klar ist. Auf diese Weise erhalten Sie eine Fehlermeldung, wenn Sie versuchen, die Variable neu zu deklarieren. Wenn es keine andere Wahl gibt, als sie neu zu deklarieren, wechseln Sie einfach zu let . Beachten Sie, dass die Werte , wie Anthony sagt, nicht unveränderlich sind (zum Beispiel kann ein const- Objekt mutierte Eigenschaften haben).
Wenn es um var geht, habe ich ES6 nie im Produktionscode verwendet und kann mir keinen Anwendungsfall dafür vorstellen. Beachten Sie jedoch, dass mit var deklarierte Variablen keinen Blockbereich haben.
quelle