JavaScript/Variable/const

Aus SELFHTML-Wiki
< JavaScript‎ | Variable(Weitergeleitet von JavaScript/const)
Wechseln zu: Navigation, Suche

Mit dem Schlüsselwort const kann eine symbolische Konstante deklariert werden. Dabei wird analog zur Initialisierung einer Variable ein Bezeichner an einen Wert gebunden, mit dem Unterschied, dass bei einer Konstante diese Bindung später nicht mehr verändert werden kann.

Syntax

const name = value;


Deklaration

Eine Konstante kann grundsätzlich überall da deklariert werden, wo auch eine Variable deklariert werden darf. Im Gegensatz zu einer Variable muss eine Konstante jedoch bei ihrer Deklaration mit einem Wert initialisiert werden, da sonst ein Syntaxfehler geworfen wird, der die Ausführung des Programms abbricht.

Beispiel
const archimedes = 3.142;

const euler      = 2.718,
      pythagoras = 1.414;

const avogadro = 6.02214E-23, theodorus;      // Syntax Error
Sie können Konstanten einzeln deklarieren, oder durch Komma getrennt auch mehrere auf einmal. Für verbesserte Lesbarkeit können Sie eine Auflistung auch auf mehrere Zeilen verteilen.


Ebenso wie bei Variablen darf der zugewiesene Wert von jedem beliebigen Datentyp sein, das heißt, es können nicht nur primitive Werte hinterlegt werden, sondern auch Objekte und damit auch Arrays und Funktionen. Genauso gut kann der Inhalt einer anderen Variablen oder Konstanten oder der Wert eines Ausdrucks zugewiesen werden

Beispiel
const addiere = function(x, y) { return x + y; };

const object = {
  wert: 42,
  name: 'ultimate answer'
};

const number = object.wert;
const question = number == 42 ? "life, universe and everything" : "what's up?";

Wird eine Konstante mit einem Objekt initialisiert, dann ist nur dieser Verweis auf das Objekt vor Veränderung geschützt. Das Objekt selbst (oder das Array oder die Funktion) hingegen nicht! Wird also wie in dem folgenden Beispiel eine Konstante mit einem Objektliteral oder einem Array initialisiert, dann können diese Objekte weiterhin manipuliert werden. Der Versuch, die Konstante mit einem anderen Wert zu ersetzen, führt hingegen zu einem TypeError.

Beispiel
const object = {
  wert: 42,
  name: 'ultimate answer'
};
object.wert = 47;            // Eigenschaft ändern: funktioniert
object.shipNumber = '1701';  // Eigenschaft hinzufügen: funktioniert
delete object.wert;          // Eigenschaft entfernen: funktioniert

const array = [ ];
array.push(Infinity);        // Array-Element hinzufügen: funktioniert

array = [ 3, 2, 1];          // Verweis auf das Array überschreiben: TypeError

In einer Konstantendeklaration ist auch Destrukturierung von Arrays oder Objekten möglich. Falls die Destrukturierung dabei auf fehlende Arrayeinträge oder Objekteigenschaften stößt, wird die Konstante mit undefined initialisiert.

Beispiel
Konstantendeklaration mit Destrukturierung eines Arrays
const greek = ['ἄλφα', 'Ωμέγα']
const [alpha, gamma, omega] = greek;

console.log(alpha, gamma, omega);
// Ausgabe: ἄλφα Ωμέγα undefined
Konstantendeklaration mit Destrukturierung eines Objekts:
const ship = {
  ident: 'NCC-1701',
  name: 'USS Enterprise',
  captain: 'Robert April'
}

const {ident, name, captain, doctor} = ship;  

console.log(`Die ${name} unter dem Kommando von ${captain} ist registriert als ${ident}.`);
console.log(`Schiffsarzt ist ${doctor}`);
// Ausgabe: 
// Die USS Enterprise unter dem Kommando von Robert April ist registriert als NCC-1701.
// Schiffsarzt ist undefined


Sichtbarkeit

Ebenso wie Variablen die unter Verwendung des Schlüsselwortes let deklariert werden ist der Gültigkeitsbereich (Scope) von Konstanten auf den Block beschränkt, in dem die Deklaration notiert wurde. Wird eine Konstante also wie in dem folgenden Beispiel innerhalb des Anweisungsblocks einer bedingten Anweisung notiert, dann kann sie von außerhalb dieses Blocks nicht referenziert werden.


Beispiel
if (true) {
  const proton = 'baryon';
}

console.info(proton); // Reference Error


Erreicht der Programmfluss einen Anweisungsblock, dann wird für diesen Block eine lexikalische Umgebung (Lexical Environment) erzeugt, die über eine Referenz auf die äußere Umgebung sowie über ein Verzeichnis der innerhalb des Blocks deklarierten Variablen und Konstanten verfügt (Environment Record). Wird in dem Block eine Konstante deklariert, dann wird deren Bezeichner dem Verzeichnis hinzugefügt, das heißt, er wird an die lexikalische Umgebung des Blocks gebunden.


Beispiel
function constant ( ) {
  // temporal dead zone
  console.info(typeof planck); // Reference Error
  // declaration
  const planck = 'quantum of action';
};

constant( );


Aber anders als bei Variablen die mittels var deklariert werden und ebenso wie bei Deklarationen mittels let, kann eine Konstante grundsätzlich nicht vor ihrer Deklaration referenziert werden. Dies erzeugt immer einen Fehler. Selbst dann, wenn wie in dem Beispiel der Operator typeof verwendet wird. Der Grund dafür ist, dass die Konstante zwar beim Eintritt in den jeweiligen Gültigkeitsbereich an dessen lexikalische Umgebung gebunden wird, dabei jedoch keine Initialisierung mit einem Wert stattfindet. Sie befindet sich also bis zu ihrer Deklaration im Quelltext in der sogenannten Temporal Dead Zone.

Redeklaration

Der Versuch, einer bereits deklarierten Konstante einen anderen Wert zuzuweisen, führt wie gesehen immer zu einem Fehler, allerdings erst, wenn der Programmfluss den fehlerhaften Zuweisungsausdruck erreicht. Wird hingegen innerhalb des Gültigkeitsbereichs einer Konstanten derselbe Bezeichner noch einmal bei einer Deklaration verwendet, dann erzeugt dies einen Typfehler zur Compilezeit (Early Error) und das Programm wird gar nicht erst ausgeführt.


Beispiel
// Type Error before execution
const unique = Symbol( );

var unique = false;


Dabei spielt es auch keine Rolle, ob der Bezeichner für eine weitere Deklaration mit const verwendet wird, oder ob damit eine Funktion oder eine Variable deklariert wird, gleich welchen Typs, oder ob ein formaler Parameter einer Funktion denselben Bezeichner besitzt. Das Programm wird beim Erkennen des Fehlers sofort terminiert.

Verwendung

Es ist zu empfehlen, const immer dann zu verwenden, wenn die Bindung von Bezeichner und Wert einer Variablen über deren Lebensdauer hinweg konstant bleiben soll, es also nicht beabsichtigt ist, der Variable zu einem späteren Zeitpunkt einen anderen Wert zuzuweisen.

Solche Variablen sind nicht sinnlos. Zum einen können Sie Berechnungsergebnisse speichern, die im darauffolgenden Programmteil mehrfach benötigt werden. Zum anderen kann es auch die Verständlichkeit des Programms verbessern, wenn eine umfangreiche Berechnung in mehrere Schritte zerlegt wird und die Zwischenergebnisse unter einem Namen zur Verfügung stehen, der ihre Bedeutung deutlich macht.

Beispiel
for (const linkElement of document.querySelector("a[href]")) {
   if (linkElement.childElementCount > 0) {
      
   }
}
Die gezeigte for...of-Schleife durchläuft alle Links im Dokument (also <a>-Elemente mit einem href-Attribut). Diese werden von der Document-Methode querySelectorAll() mit einem geeigneten Selektor ermittelt.

Die Variable, in der die Schleife das gerade verarbeitete Element ablegt, kann als const deklariert werden, da sie für einen Schleifendurchlauf unverändert bleiben wird.

Weblinks

Let and Const Declarations Let and Const ECMAScript 2015 ECMAScript 2016 ECMAScript 2017 Draft
  • Forums-Postings: const let var Teil 1 und Teil 2 von Orlok (17.04.2016)