wake-up-neo.net

Const in Javascript? Wann und wann ist es notwendig?

Ich bin kürzlich auf das Schlüsselwort const in Javascript gestoßen. Soweit ich das beurteilen kann, wird es zum Erstellen von unveränderlichen Variablen verwendet, 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'

Ich stelle fest, 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 die var Schlüsselwort könnte mit dem gleichen Effekt verwendet werden.

Fragen?

Wann ist es sinnvoll, const anstelle von var zu verwenden? 

Soll es jedes Mal verwendet werden, wenn eine Variable deklariert wird, die nicht erneut zugewiesen werden soll? 

Macht es tatsächlich einen Unterschied, ob var anstelle von const verwendet wird oder umgekehrt?

299
axdg

Ihre Fragen haben zwei Aspekte: Was sind die technischen Aspekte der Verwendung von const anstelle von var und welche menschenbezogenen Aspekte hat dies?.

Der technische Unterschied ist erheblich. In kompilierten Sprachen wird eine Konstante zum Zeitpunkt der Kompilierung ersetzt, und ihre Verwendung ermöglicht weitere Optimierungen wie das Entfernen von totem Code, um die Laufzeiteffizienz des Codes weiter zu steigern. Aktuelle (lose verwendete Begriffe) JavaScript-Engines kompilieren tatsächlich JS-Code, um eine bessere Leistung zu erzielen. Wenn Sie 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.

Bei dem Aspekt des Menschen geht es um die Semantik des Keywords. 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 werden. Wenn Platz für Fehler besteht, sollte immer var verwendet werden. Es müssen jedoch nicht alle Informationen, die sich während der Lebensdauer eines Programms niemals ändern, mit const deklariert werden. Wenn sich die Informationen unter anderen Umständen ändern sollten, verwenden Sie var, um dies anzuzeigen, auch wenn die tatsächliche Änderung nicht in Ihrem Code angezeigt wird.

418
Tibos

2017 Update

Diese Antwort findet noch viel Aufmerksamkeit. Es ist erwähnenswert, dass diese Antwort Anfang 2014 veröffentlicht wurde und sich seitdem viel geändert hat. ecmascript-6 support ist jetzt die Norm. Alle modernen Browser unterstützen jetzt const und sollten daher ohne Probleme sicher verwendet werden können.


Originalantwort von 2014

Trotz der ziemlich anständigen Browserunterstützung würde ich es momentan vermeiden. Aus MDNs Artikel über const :

Die aktuelle Implementierung von const ist eine Mozilla-spezifische Erweiterung und ist nicht Teil von ECMAScript 5. Sie wird in Firefox & Chrome (V8) unterstützt. Wenn Sie ab Safari 5.1.7 und Opera 12.00 in diesen Browsern eine Variable mit const definieren, können Sie den Wert später noch ändern. Es wird nicht von Internet Explorer 6-10 unterstützt, ist jedoch in Internet Explorer 11 enthalten. Das Schlüsselwort const deklariert derzeit die Konstante im Funktionsumfang (wie mit var deklarierte Variablen).

Dann heißt es weiter:

const wird von ECMAScript 6 definiert, jedoch mit unterschiedlicher Semantik. Ähnlich wie bei mit der let-Anweisung deklarierten Variablen werden Konstanten, die mit const deklariert wurden, in Blockform angegeben.

Wenn Sie const verwenden, müssen Sie eine Problemumgehung hinzufügen, um etwas ältere Browser zu unterstützen.

68
James Donnelly

Um die vorherigen Antworten zu integrieren, bietet die Deklaration konstanter Variablen neben dem Leistungsgrund einen offensichtlichen Vorteil: Wenn Sie versehentlich versuchen, sie im Code zu ändern oder erneut zu deklarieren, ändert das Programm den Wert nicht bzw. gibt keinen Fehler aus.

Vergleichen Sie zum Beispiel:

// Will output 'SECRET'

const x = 'SECRET'
if (x = 'ANOTHER_SECRET') {  // Warning! assigning a value variable in an if condition
    console.log (x)
}

mit:

// Will output 'ANOTHER_SECRET'

var y = 'SECRET'
if (y = 'ANOTHER_SECRET') { 
    console.log (y)
}

oder

// Will throw TypeError: const 'x' has already been declared

const x = "SECRET"

/*  complex code */

var x = 0

mit 

// Will reassign y and cause trouble

var y = "SECRET"

/*  complex code */

var y = 0
36
janesconference

const ist nicht unveränderlich.

Aus dem MDN :

Die const-Deklaration erstellt einen schreibgeschützten Verweis auf einen Wert. Es bedeutet nicht, dass der Wert, den es enthält, unveränderlich ist, nur dass die Variable Bezeichner kann nicht erneut zugewiesen werden.

29
Antoine

Warum const verwendet wird, ist die Antwort von @ Tibos großartig.

Aber du hast gesagt:

Soweit ich das beurteilen kann, wird es verwendet, um unveränderliche Variablen zu erstellen

Das ist falsch. Das Variieren einer Variablen unterscheidet sich von der Neuzuweisung:

var hello = 'world' // assigning
hello = 'bonjour!' // reassigning

Mit const können Sie das nicht tun:

const hello = 'world'
hello = 'bonjour!' // error

Sie können Ihre Variable jedoch mutieren:

const marks = [92, 83]
marks.Push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.

Jeder Prozess, der den Wert der Variablen ohne mit dem Zeichen = ändert, ist daher stummgeschaltet.

Hinweis: += ist zum Beispiel ... neu zuweisen!

var a = 5
a += 2 // is the same as a = a + 2

Die letzte Zeile lautet also: const hindert Sie nicht daran, mutierende-Variablen, sie hindert Sie daran, neu zuweisen.

22
math2001

Sie haben großartige Antworten, aber lassen Sie uns einfach bleiben.

const sollte verwendet werden, wenn Sie eine definierte Konstante haben (gelesen als: sie ändert sich während der Programmausführung nicht).

Zum Beispiel:

const pi = 3.1415926535

Wenn Sie der Meinung sind, dass dies bei der späteren Ausführung geändert werden kann, verwenden Sie eine var.

Der praktische Unterschied, basierend auf dem Beispiel, besteht darin, dass Sie mit const immer davon ausgehen, dass Pi 3.14 ist, [...] es ist eine Tatsache.

Wenn Sie es als var definieren, kann es sich um 3.14 [...] handeln oder nicht.

Für eine technischere Antwort ist @Tibos akademisch richtig.

10
Edgar Griñant

var : Deklarieren einer Variablen, Wertinitialisierung optional.

let : Deklaration einer lokalen Variablen mit Blockumfang.

const : Deklariert eine schreibgeschützte Konstante.

Ex:

var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3

let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);

// const c;
// c = 9;   //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.
6
Srikrushna Pal

In meiner Erfahrung verwende ich const , wenn ich etwas einstellen möchte, das ich später ändern möchte, ohne den Code durchforsten zu müssen, der nach hart codierten Bits, z. Ein Dateipfad oder Servername. 

Der Fehler beim Testen ist jedoch eine andere Sache. Sie versuchen, eine andere Variable namens x zu erstellen. Dies wäre ein genauerer Test.

const x = 'const';
x = 'not-const';
6
Funkotron_King

Persönliche Vorlieben wirklich. Sie könnten const verwenden, wenn sie, wie Sie sagen, nicht neu zugewiesen wird und konstant ist. Zum Beispiel, wenn Sie Ihren Geburtstag zuordnen möchten. Ihr Geburtstag ändert sich nie und Sie könnten ihn als Konstante verwenden. Aber dein Alter ändert sich, so dass dies eine Variable sein könnte.

4
Carl Markham

Zusammenfassung: 

const erstellt eine unveränderliche Bindung, was bedeutet, dass der Variablenname const nicht erneut zugewiesen werden kann. 

const a = "value1";

sie können es nicht mit neu zuweisen 

a = "value2";

Wenn const Identifier ein Objekt oder ein Array enthält, kann dessen Wert geändert werden, sofern wir ihn nicht erneut zuweisen.

const x = { a: 1 }

x.a = 2; //is possible and allowed

const numbers = [1, 2];
numbers.Push(3); //is possible and allowed

Bitte beachten Sie, dass const ein Blockbereich ist, genau wie let, der nicht mit var (der Funktionsbereich) identisch ist.

Kurz gesagt: Wenn etwas unwahrscheinlich ist, dass durch Neuzuweisung ändern verwenden Sie const, oder verwenden Sie let oder var, je nach Umfang, den Sie verwenden würde gerne haben.

Es ist viel einfacher, über den Code nachzudenken, wenn es offensichtlich ist, was durch Neuzuordnung geändert werden kann und was nicht. Ein const in ein let zu ändern ist einfach. Wenn Sie const standardmäßig ausführen, müssen Sie vorher noch einmal darüber nachdenken. Und das ist in vielen Fällen eine gute Sache.

2
Tejas Patel

Es bietet: 1) eine konstante Referenz, zB const x = [] - das Array kann geändert werden, aber x kann nicht auf ein anderes Array zeigen; und 2) Block Scoping . const und let wird zusammen in ecma6/2015 .__ var ersetzen. Siehe Diskussion unter https://strongloop.com/strongblog/es6-variable-declarations/

2
Genovo
Main point is that how to decide which one identifier should be used during development.
In Java-script here are three identifiers.

1. var (Can re-declared & re-initialize)
2. const (Can't re-declared & re-initialize, can update array values by using Push)
3. let (Can re-initialize but can't re-declare)

'var': Wenn wir über Code-Standard reden, verwenden wir normalerweise den Namen des Bezeichners, der für andere Benutzer/Entwickler leicht verständlich ist. Wenn wir zum Beispiel über viele Funktionen nachdenken, verwenden wir Eingaben, verarbeiten diese und geben Ergebnisse zurück, wie zum Beispiel:

**Example of variable use**

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2;
 return result;
}

In den obigen Beispielen erzeugen beide Funktionen unterschiedliche 2-Ergebnisse, verwenden jedoch denselben Namen von Variablen. Hier können wir sehen, dass 'Prozess' und 'Ergebnis' beide als Variablen verwendet werden und sie sollten es sein. 

 **Example of constant with variable**

 const tax = 10; 
 const pi = 3.1415926535; 

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

Bevor Sie 'let' in Java-Script verwenden können, müssen Sie oben in der js-Datei 'use strict' hinzufügen

 **Example of let with constant & variable**

 const tax = 10; 
 const pi = 3.1415926535; 
 let trackExecution = '';

function firstFunction(input1,input2)
{
 trackExecution += 'On firstFunction'; 
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 trackExecution += 'On otherFunction'; # can add current time 
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

 firstFunction();
 otherFunction();
 console.log(trackExecution);

In obigem Beispiel können Sie nachverfolgen, welche Funktion ausgeführt wurde, und welche Funktion in bestimmten Aktionen nicht verwendet wurde.

2
vinod

Erstens drei nützliche Dinge zu const (abgesehen von den Bereichsverbesserungen, die es mit let teilt):

  • Es dokumentiert für Personen, die den Code später lesen, dass sich der Wert nicht ändern darf.
  • Es verhindert, dass Sie (oder jemand, der nach Ihnen kommt) den Wert ändern, es sei denn, er geht zurück und ändert die Deklaration absichtlich.
  • Es könnte die JavaScript-Engine einige Analysen im Hinblick auf die Optimierung speichern. Zum Beispiel haben Sie erklärt, dass sich der Wert nicht ändern kann, sodass die Engine nicht arbeiten muss, um herauszufinden, ob sich der Wert ändert, damit sie basierend auf dem Wert, der sich nicht ändert, entscheiden kann, ob sie optimiert.

Deine Fragen:

Wann ist es angebracht, const anstelle von var zu verwenden?

Sie können jederzeit 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.

Sollte es jedes Mal verwendet werden, wenn eine Variable deklariert wird, die nicht neu zugewiesen wird?

Das liegt an Ihnen/Ihrem Team.

Macht es tatsächlich einen Unterschied, ob var is used in place ofconst` oder umgekehrt?

Ja:

  • var und const haben unterschiedliche Bereichsregeln. (Möglicherweise möchten Sie eher mit let als mit var vergleichen.) Insbesondere: const und let sind blockspezifisch und werden global verwendet Erstellen Sie keine Eigenschaften für das globale Objekt (auch wenn sie globale Objekte erstellen). var verfügt entweder über einen globalen Bereich (bei Verwendung im globalen Bereich) oder einen Funktionsbereich (auch bei Verwendung in einem Block) und erstellt bei Verwendung im globalen Bereich eine Eigenschaft für das globale Objekt.
  • Siehe meine "drei nützlichen Dinge" oben, sie gelten alle für diese Frage.
1
T.J. Crowder

Ich bin kein Experte für das JS-Compiling-Geschäft, aber es ist sinnvoll zu sagen, dass v8 vom const-Flag Gebrauch macht

Normalerweise nach dem Deklarieren und Ändern einer Reihe von Variablen wird der Speicher fragmentiert, und v8 stoppt die Ausführung, macht einige Sekunden eine Pause, um gc oder Garbage Collection zu erstellen.

wenn eine Variable mit const v8 deklariert wird, kann man sicher sein, sie in einen engen Container mit fester Größe zwischen anderen const-Variablen einzufügen, da sie sich niemals ändert .. Sie kann auch die richtigen Vorgänge für diese Datentypen speichern, da sich der Typ nicht ändert .

0
Jew

'const' ist ein Hinweis auf Ihren Code, dass die Kennung nicht erneut zugewiesen wird. Dies ist ein guter Artikel über die Verwendung von 'const', 'let' oder 'var' https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75 # .ukgxpfhao

0
Ananda