JavaScript/Variable/const

Aus SELFHTML-Wiki
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.

  • Chrome
  • Firefox
  • IE 11
  • Opera
  • Safari

Details: caniuse.com

Syntax

const name = value;


Deklaration[Bearbeiten]

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 unmittelbar mit einem Wert initialisiert werden, da sonst ein Syntaxfehler geworfen wird, der die Ausführung des Programms verhindert.


Beispiel
const archimedes = 3.142;

const euler = 2.718, pythagoras = 1.414;

const theodorus; // Syntax Error


Wie das Beispiel oben zeigt, können durch Komma getrennt auch mehrere Konstanten auf einmal deklariert werden. Aber auch bei dieser Form der Notation muss jeder Konstanten ein Wert zugewiesen werden.


Beispiel
const symbol = Symbol('description');

const object = {
  method ( ) {
    const string = 'constant';
  }
};


Ebenso wie bei Variablen darf der zugewiesene Wert von jedem beliebigen Datentyp sein, das heißt, es können nicht nur skalare Werte hinterlegt werden, sondern auch Werte vom Datentyp Object und damit auch Arrays und Funktionen. Wird einer Konstante ein Wert vom Datentyp Object zugewiesen, dann ist allerdings zu beachten, dass im Gegensatz zu primitiven Werten, die nach ihrer Erzeugung nicht mehr verändert werden können, das Objekt selbst durch die Zuweisung nicht vor Veränderung geschützt ist.


Beispiel
const object = { };
object.property = 'value';

const array = [ ];
array.push(Infinity);

array = null; // Type Error


Wird also wie in dem Beispiel oben eine Konstante mit einem planen Objekt oder einem Array initialisiert, dann können diese Objekte weiterhin manipuliert werden. Nur die Lösung der Bindung von Bezeichner und Wert einer Konstante erzeugt einen Fehler.


Beispiel
function relativity ( ) {
  return 'einstein';
}

const works = relativity;

const fails = aether; // Reference Error


Bei der Deklaration kann als Wert natürlich auch eine Referenz zugewiesen werden, aber genau wie bei der Initialisierung einer Variablen wird ein Fehler geworfen, wenn die Referenz nicht aufgelöst werden kann, und nicht etwa implizit der Wert undefined ergänzt.


Beispiel
const result = (function (argument) {
  return argument.toString( );
}(true));

const value = typeof result == 'string' ? result : false;

console.info(value); // true


Ebenfalls nicht anders als bei Variablen, kann auch bei der Initialisierung einer Konstanten auf der rechten Seite der Zuweisung ein beliebiger Ausdruck notiert werden, dessen Wert dann an den Bezeichner gebunden wird.


Beispiel
const [alpha, omega] = ['ἄλφα', 'Ωμέγα'];

const object = {
  delta : 'Δέλτα'
}

const {delta} = object;

[alpha, delta, omega].forEach(value => {
  console.log(typeof value); // 3x string
});


Schließlich kann auch die Syntax zur Destrukturierung von Arrays oder Objekten verwendet werden, um eine oder mehrere Konstanten zu deklarieren. Der Zugriff auf nicht existierende Elemente in einem Array oder nicht definierte Objekteigenschaften bewirkt, dass die Konstante mit dem Wert undefined initialisiert wird.

Sichtbarkeit[Bearbeiten]

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[Bearbeiten]

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[Bearbeiten]

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. Denn dies macht den Quellcode transparenter und ermöglicht Optimierungen hinsichtlich der Performanz des Programms durch den Interpreter.


Beispiel
for (let index = 0; index < 5; index ++) {
  const value = index * 2;
  // do something with value
}


Dabei ist jedoch zu berücksichtigen, dass const erst seit der sechsten Edition von ECMAScript offiziell standardisiert ist und die Syntax dementsprechend unter Umständen zum Zeitpunkt der Lektüre dieses Artikels noch nicht von allen relevanten Ausführungsumgebungen unterstützt wird. Einen Überblick zum Stand der Unterstützung bietet kangax compatibility table.

Weblinks[Bearbeiten]

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)