Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Dieses Kapitel behandelt die grundlegende Grammatik von JavaScript, Variablendeklarationen, Datentypen und Literale.
JavaScript übernimmt den Großteil seiner Syntax von Java, C und C++, wurde aber auch von Awk, Perl und Python beeinflusst.
JavaScript ist groß- und kleinschreibungsempfindlich und verwendet das Unicode-Zeichensatz. Zum Beispiel könnte das Wort Früh (was auf Deutsch "früh" bedeutet) als Variablenname verwendet werden.
Allerdings ist die Variable früh nicht identisch mit Früh, da JavaScript groß- und kleinschreibungsempfindlich ist.
In JavaScript werden Anweisungen statements genannt und durch Semikolons (;) getrennt.
Ein Semikolon ist nach einer Anweisung nicht erforderlich, wenn sie auf einer eigenen Zeile steht. Wenn jedoch mehr als eine Anweisung auf einer Zeile gewünscht ist, müssen sie durch Semikolons getrennt werden.
Hinweis: ECMAScript hat auch Regeln zur automatischen Einfügung von Semikolons (ASI), um Anweisungen zu beenden. (Für weitere Informationen siehe das ausführliche Referenzdokument zu JavaScripts lexikalischer Grammatik.)
Es wird jedoch als Best Practice angesehen, immer ein Semikolon nach einer Anweisung zu schreiben, selbst wenn es nicht zwingend erforderlich ist. Diese Praxis verringert die Wahrscheinlichkeit, dass Fehler in den Code gelangen.
Der Quelltext eines JavaScript-Skripts wird von links nach rechts gescannt und in eine Folge von Eingabeelementen umgewandelt, die Tokens, Steuerzeichen, Zeilenendezeichen, Kommentare oder Leerzeichen sind. (Leerzeichen, Tabs und Zeilenumbrüche werden als Leerzeichen betrachtet.)
Die Syntax von Kommentaren ist die gleiche wie in C++ und vielen anderen Sprachen:
Sie können Blockkommentare nicht verschachteln. Dies passiert häufig, wenn Sie versehentlich eine */-Sequenz in Ihren Kommentar einfügen, was den Kommentar beenden wird.
In diesem Fall müssen Sie das */-Muster aufbrechen, zum Beispiel durch das Einfügen eines Backslashes:
Kommentare verhalten sich wie Leerzeichen und werden während der Skriptausführung verworfen.
Hinweis: Möglicherweise sehen Sie auch eine dritte Kommentar-Syntax am Anfang einiger JavaScript-Dateien, die folgendermaßen aussieht: #!/usr/bin/env node.
Dies wird Hashbang-Kommentar-Syntax genannt und ist ein spezieller Kommentar, der den Pfad zu einer bestimmten JavaScript-Engine spezifiziert, die das Skript ausführen soll. Siehe Hashbang-Kommentare für mehr Details.
JavaScript verfügt über drei Arten von Variablendeklarationen.
varDeklariert eine Variable, optional initialisiert mit einem Wert.
letDeklariert eine block-scoped lokale Variable, optional initialisiert mit einem Wert.
constDeklariert eine block-scoped, schreibgeschützte benannte Konstante.
Sie verwenden Variablen als symbolische Namen für Werte in Ihrer Anwendung. Die Namen von Variablen, die als Identifiers bezeichnet werden, müssen bestimmten Regeln entsprechen.
Ein JavaScript-Identifikator beginnt normalerweise mit einem Buchstaben, Unterstrich (_) oder Dollarzeichen ($). Nachfolgende Zeichen können auch Ziffern (0 – 9) sein. Da JavaScript groß- und kleinschreibungsempfindlich ist, umfassen Buchstaben die Zeichen A bis Z (Großbuchstaben) sowie a bis z (Kleinbuchstaben).
Sie können die meisten Unicode-Buchstaben wie å und ü in Identifizierern verwenden. (Für weitere Details siehe die Referenz zu lexikalischer Grammatik.) Sie können auch Unicode-Escape-Sequenzen verwenden, um Zeichen in Identifizierern darzustellen.
Einige Beispiele für rechtmäßige Namen sind Number_hits, temp99, $credit und _name.
Sie können eine Variable auf zwei Arten deklarieren:
Sie können Variablen deklarieren, um Werte unter Verwendung der Destructuring-Syntax zu entpacken. Zum Beispiel: const { bar } = foo. Dies wird eine Variable mit dem Namen bar erzeugen und ihr den Wert zuweisen, der dem gleichnamigen Schlüssel unseres Objekts foo entspricht.
Variablen sollten immer deklariert werden, bevor sie verwendet werden. JavaScript erlaubte früher die Zuweisung an nicht deklarierte Variablen, was eine undeclared global Variable erstellt. Dies ist ein Fehler im Strikten Modus und sollte insgesamt vermieden werden.
In einer Anweisung wie let x = 42 wird der Teil let x als Deklaration bezeichnet, und der Teil = 42 wird als Initializer bezeichnet. Die Deklaration ermöglicht es, später im Code auf die Variable zuzugreifen, ohne einen ReferenceError auszulösen, während der Initializer der Variablen einen Wert zuweist. In var- und let-Deklarationen ist der Initializer optional. Wenn eine Variable ohne Initializer deklariert wird, wird ihr der Wert undefined zugewiesen.
Im Wesentlichen ist let x = 42 gleichbedeutend mit let x; x = 42.
const-Deklarationen benötigen immer einen Initializer, da sie jede Art von Zuweisung nach der Deklaration verbieten und eine implizite Initialisierung mit undefined wahrscheinlich ein Programmierfehler ist.
Eine Variable kann zu einem der folgenden Scopes gehören:
Zusätzlich können Variablen, die mit let oder const deklariert wurden, zu einem zusätzlichen Scope gehören:
Wenn Sie eine Variable außerhalb einer Funktion deklarieren, wird sie als globale Variable bezeichnet, weil sie jedem anderen Code im aktuellen Dokument zur Verfügung steht. Wenn Sie eine Variable innerhalb einer Funktion deklarieren, wird sie als lokale Variable bezeichnet, weil sie nur innerhalb dieser Funktion verfügbar ist.
let- und const-Deklarationen können auch auf den Block-Statement beschränkt sein, in dem sie deklariert werden.
Jedoch sind mit var erstellte Variablen nicht blockgebunden, sondern nur lokal zum Funktions- (oder globalen Scope), in dem sich der Block befindet.
Zum Beispiel wird der folgende Code 5 ausgeben, weil der Scope von x der globale Kontext ist (oder der Funktionskontext, wenn der Code Teil einer Funktion ist). Der Scope von x ist nicht auf den unmittelbaren if-Block beschränkt.
Mit var deklarierte Variablen werden gehoben, was bedeutet, dass Sie auf die Variable überall in ihrem Scope verweisen können, auch wenn ihre Deklaration noch nicht erreicht wurde. Sie können sich var-Deklarationen als "an die Spitze" ihrer Funktions- oder globalen Scope "gehoben" vorstellen. Jedoch, wenn Sie auf eine Variable zugreifen, bevor sie deklariert wird, ist der Wert immer undefined, weil nur die Deklaration und die Standardinitialisierung (mit undefined) gehoben werden, nicht aber die Wertzuweisung.
Die obigen Beispiele werden interpretiert als:
Aufgrund des Hoistings sollten alle var-Anweisungen in einer Funktion so nah wie möglich an den Anfang der Funktion gestellt werden. Diese Best Practice erhöht die Klarheit des Codes.
Ob let und const gehoben werden, ist eine Frage der Definitionsdebatte. Der Versuch, auf die Variable im Block vor der Variablendeklaration zuzugreifen, führt immer zu einem ReferenceError, weil sich die Variable in einer "zeitlichen Todeszone" von Beginn des Blocks bis zur Verarbeitung der Deklaration befindet.
Im Gegensatz zu var-Deklarationen, die nur die Deklaration, aber nicht ihren Wert anheben, werden Funktionsdeklarationen vollständig angehoben — Sie können die Funktion sicher überall in ihrem Scope aufrufen. Siehe den Hoisting-Glossarbeitrag für weitere Diskussionen.
Globale Variablen sind in der Tat Eigenschaften des globalen Objekts.
In Webseiten ist das globale Objekt window, sodass Sie globale Variablen mit der Syntax window.variable lesen und setzen können. In allen Umgebungen kann die globalThis-Variable (die selbst eine globale Variable ist) verwendet werden, um globale Variablen zu lesen und zu setzen. Dies soll eine konsistente Schnittstelle zwischen verschiedenen JavaScript-Laufzeiten bieten.
Folglich können Sie auf globale Variablen, die in einem Fenster oder Frame deklariert sind, von einem anderen Fenster oder Frame zugreifen, indem Sie den window- oder frame-Namen angeben. Zum Beispiel, wenn eine Variable namens phoneNumber in einem Dokument deklariert ist, können Sie auf diese Variable aus einem iframe wie folgt zugreifen: parent.phoneNumber.
Sie können eine schreibgeschützte, benannte Konstante mit dem Schlüsselwort const erstellen. Die Syntax eines Konstanten-Identifikators ist die gleiche wie bei jedem anderen Variablen-Identifikator: Er muss mit einem Buchstaben, Unterstrich oder Dollarzeichen ($) beginnen und kann alphabetische, numerische oder Unterstrichzeichen enthalten.
Eine Konstante kann während der Skriptausführung weder durch Zuweisung einen neuen Wert erhalten noch neu deklariert werden. Sie muss mit einem Wert initialisiert werden. Die Scope-Regeln für Konstanten sind dieselben wie für let-Blockbereichsvariablen.
Sie können keine Konstante mit dem gleichen Namen wie eine Funktion oder Variable im gleichen Scope deklarieren. Zum Beispiel:
Allerdings verhindert const nur Neu-Zuweisungen, nicht aber Mutationen. Die Eigenschaften von Objekten, die Konstanten zugewiesen sind, sind nicht geschützt, sodass die folgende Anweisung problemlos ausgeführt wird.
Auch der Inhalt eines Arrays ist nicht geschützt, sodass die folgende Anweisung ohne Probleme ausgeführt wird.
Der neueste ECMAScript-Standard definiert acht Datentypen:
Sieben Datentypen, die primitive sind:
und Object
Obwohl diese Datentypen relativ wenige sind, ermöglichen sie es Ihnen, nützliche Operationen mit Ihren Anwendungen auszuführen. Funktionen sind die anderen grundlegenden Elemente der Sprache. Während Funktionen technisch eine Art von Objekt sind, können Sie sich Objekte als benannte Container für Werte vorstellen und Funktionen als Verfahren, die Ihr Skript ausführen kann.
JavaScript ist eine dynamisch typisierte Sprache. Das bedeutet, dass Sie beim Deklarieren einer Variablen den Datentyp nicht angeben müssen. Es bedeutet auch, dass Datentypen bei Bedarf während der Skriptausführung automatisch konvertiert werden.
So könnten Sie zum Beispiel eine Variable wie folgt definieren:
Und später könnten Sie derselben Variablen einen String-Wert zuweisen, zum Beispiel:
Da JavaScript dynamisch typisiert ist, führt diese Zuweisung nicht zu einer Fehlermeldung.
In Ausdrücken mit numerischen und String-Werten, die den +-Operator verwenden, konvertiert JavaScript numerische Werte zu Strings. Zum Beispiel, beachten Sie die folgenden Anweisungen:
Bei allen anderen Operatoren konvertiert JavaScript nicht numerische Werte zu Strings. Zum Beispiel:
Wenn ein Wert, der eine Zahl darstellt, im Speicher als String vorliegt, gibt es Methoden zur Konvertierung.
parseInt gibt nur ganze Zahlen zurück, sodass seine Verwendung bei Dezimalzahlen eingeschränkt ist.
Hinweis: Eine bewährte Vorgehensweise bei parseInt ist, immer den radix-Parameter einzuschließen. Der Radix-Parameter wird verwendet, um anzugeben, welches Zahlensystem verwendet werden soll.
Eine alternative Methode, um eine Zahl aus einem String zu erhalten, ist mit dem + (unären Plus) Operator. Dies führt implizit eine Zahlkonvertierung durch, die dem gleichen Prozess wie die Number()-Funktion entspricht.
Literale repräsentieren Werte in JavaScript. Dies sind feste Werte — keine Variablen —, die Sie in Ihr Skript wörtlich eingeben. In diesem Abschnitt werden folgende Typen von Literalen beschrieben:
Ein Array-Literal ist eine Liste von null oder mehr Ausdrücken, von denen jedes ein Array-Element darstellt, eingeschlossen in eckigen Klammern ([]). Wenn Sie ein Array mithilfe eines Array-Literals erstellen, wird es mit den angegebenen Werten als seine Elemente initialisiert, und seine length wird auf die Anzahl der angegebenen Argumente gesetzt.
Das folgende Beispiel erstellt das coffees-Array mit drei Elementen und einer length von drei:
Ein Array-Literal erstellt bei jeder Auswertung des Literals ein neues Array-Objekt. Zum Beispiel, ein Array, das mit einem Literal im globalen Scope definiert ist, wird einmal erstellt, wenn das Skript geladen wird. Befindet sich jedoch das Array-Literal in einer Funktion, wird bei jedem Aufruf der Funktion ein neues Array instanziiert.
Hinweis: Array-Literale erstellen Array-Objekte. Siehe Array und Indizierte Sammlungen für Details zu Array-Objekten.
Wenn Sie zwei Kommas in einem Array-Literal hintereinander setzen, lässt das Array einen leeren Platz für das nicht spezifizierte Element. Das folgende Beispiel erstellt das fish-Array:
Wenn Sie dieses Array protokollieren, sehen Sie:
Beachten Sie, dass das zweite Element "leer" ist, was nicht genau dasselbe ist wie der tatsächliche undefined-Wert. Bei der Verwendung von Array-Durchsuchungsmethoden wie Array.prototype.map werden leere Felder übersprungen. Der Indexzugriff fish[1] gibt jedoch immer noch undefined zurück.
Wenn Sie ein abschließendes Komma am Ende der Liste der Elemente einfügen, wird das Komma ignoriert.
Im folgenden Beispiel beträgt die length des Arrays drei. Es gibt kein myList[3] und myList[1] ist leer. Alle anderen Kommas in der Liste kennzeichnen ein neues Element.
Im folgenden Beispiel beträgt die length des Arrays vier und myList[0] sowie myList[2] fehlen.
In dem folgenden Beispiel beträgt die length des Arrays vier und myList[1] sowie myList[3] fehlen. Nur das letzte Komma wird ignoriert.
Hinweis: Abschließende Kommas tragen dazu bei, git-diffs sauber zu halten, wenn Sie ein mehrzeiliges Array haben, da das Anhängen eines Elements am Ende nur eine Zeile hinzufügt, die vorherige Zeile jedoch nicht verändert.
Das Verständnis des Verhaltens zusätzlicher Kommas ist wichtig, um JavaScript als Sprache zu verstehen.
Wenn Sie Ihren eigenen Code schreiben, sollten Sie fehlende Elemente jedoch explizit als undefined deklarieren oder zumindest einen Kommentar einfügen, um auf das Fehlen hinzuweisen. Dies erhöht die Klarheit und Wartbarkeit Ihres Codes.
Der Boolean-Typ hat zwei Literalwerte: true und false.
Hinweis: Verwechseln Sie nicht die primitiven Boolean-Werte true und false mit den true- und false-Werten des Boolean-Objekts.
Das Boolean-Objekt ist eine Hülle um den primitiven Boolean-Datentyp. Siehe Boolean für mehr Informationen.
JavaScript-numerische Literale schließen ganze Zahlen in verschiedenen Basen sowie Gleitkommaliterale in Basis-10 ein.
Beachten Sie, dass die Sprachspezifikation verlangt, dass numerische Literale unsigniert sind. Dennoch sind Codefragmente wie -123.4 in Ordnung und werden als unärer - Operator interpretiert, der auf das numerische Literal 123.4 angewendet wird.
Ganzzahlen- und BigInt-Literale können in Dezimal (Basis 10), Hexadezimal (Basis 16), Oktal (Basis 8) und Binär (Basis 2) geschrieben werden.
Einige Beispiele für Ganzzahl-Literale sind:
0, 117, 123456789123456789n (decimal, base 10) 015, 0001, 0o777777777777n (octal, base 8) 0x1123, 0x00111, 0x123456789ABCDEFn (hexadecimal, "hex" or base 16) 0b11, 0b0011, 0b11101001010101010101n (binary, base 2)Für mehr Informationen siehe Numerische Literale in der lexikalischen Grammatikreferenz.
Ein Gleitpunkt-Literal kann die folgenden Teile haben:
Der Exponententeil ist ein e oder E, gefolgt von einer Ganzzahl, die vorzeichenbehaftet sein kann (eingeleitet durch + oder -). Ein Gleitpunkt-Literal muss mindestens eine Ziffer und entweder einen Dezimalpunkt oder e (oder E) enthalten.
Kürzer beschrieben ist die Syntax:
[digits].[digits][(E|e)[(+|-)]digits]Zum Beispiel:
Ein Objektliteral ist eine Liste mit null oder mehr Paaren von Eigenschaftsnamen und zugeordneten Werten eines Objekts, eingeschlossen in geschweiften Klammern ({}).
Warnung: Verwenden Sie kein Objektliteral am Anfang einer Anweisung! Dies führt zu einem Fehler (oder verhält sich nicht wie erwartet), da { als Beginn eines Blocks interpretiert wird.
Das folgende ist ein Beispiel für ein Objektliteral. Das erste Element des car-Objekts definiert eine Eigenschaft, myCar, und weist ihr einen neuen String zu, "Saturn"; das zweite Element, die getCar-Eigenschaft, wird sofort mit dem Ergebnis des Aufrufs der Funktion (carTypes("Honda")) zugewiesen; das dritte Element, die special-Eigenschaft, verwendet eine bestehende Variable (sales).
Darüber hinaus können Sie einen numerischen oder string Literal für den Namen einer Eigenschaft verwenden oder ein Objekt in ein anderes verschachteln. Das folgende Beispiel nutzt diese Optionen.
Eigenschaftsnamen von Objekten können beliebige Strings sein, einschließlich des leeren Strings. Wenn der Eigenschaftsname kein gültiger JavaScript-Identifikator oder keine Zahl ist, muss er in Anführungszeichen eingeschlossen werden.
Eigenschaftsnamen, die keine gültigen Identifikatoren sind, können nicht als Punkt (.)-Eigenschaften aufgerufen werden.
Stattdessen müssen sie mit der Klammernotation ([]) aufgerufen werden.
Objektliterale unterstützen eine Reihe von Kurznotierungen, die das Festlegen des Prototyps bei der Konstruktion, Kurzformen für foo: foo-Zuweisungen, die Definition von Methoden, das Aufrufen von super-Methoden und die Berechnung von Eigenschaftsnamen mit Ausdrücken umfassen.
Diese bringen Objektliterale und Klassendeklarationen näher zusammen und ermöglichen es objektbasierten Designs, von den gleichen Annehmlichkeiten zu profitieren.
Ein Regex-Literal (das im Detail später definiert wird) ist ein Muster zwischen Schrägstrichen eingeschlossen. Das folgende ist ein Beispiel für ein Regex-Literal.
Ein Stringliteral ist null oder mehr Zeichen, die in doppelte (") oder einfache (') Anführungszeichen eingeschlossen sind. Ein String muss durch Anführungszeichen des gleichen Typs begrenzt werden (das heißt, entweder beide einfache Anführungszeichen oder beide doppelte Anführungszeichen).
Die folgenden sind Beispiele für Stringliterale:
Sie sollten Stringliterale verwenden, es sei denn, Sie müssen ausdrücklich ein String-Objekt verwenden. Siehe String für Details zu String-Objekten.
Sie können alle Methoden des String-Objekts auf einen Stringliteral-Wert aufrufen. JavaScript wandelt den Stringliteral automatisch in ein temporäres String-Objekt um, ruft die Methode auf und verwirft dann das temporäre String-Objekt. Sie können auch die length-Eigenschaft mit einem Stringliteral verwenden:
Template-Literale sind ebenfalls verfügbar. Template-Literale werden durch das Back-Tick-Zeichen (`) (Gravis) anstelle von doppelten oder einfachen Anführungszeichen eingeschlossen.
Template-Literale bieten syntaktische Zucker für die Konstruktion von Strings. (Dies ähnelt den String-Interpolationsfunktionen in Perl, Python und mehr.)
Tagged Templates sind eine kompakte Syntax, um ein Template-Literal zusammen mit einem Aufruf einer "Tag"-Funktion zum Parsen zu spezifizieren. Ein Tag-Template ist nur eine knappe und semantische Möglichkeit, eine Funktion aufzurufen, die einen String und eine Menge relevanter Werte verarbeitet. Der Name der Template-Tag-Funktion geht dem Template-Literal voraus — wie im folgenden Beispiel, bei dem die Template-Tag-Funktion print heißt. Die print-Funktion wird die Argumente interpolieren und Objekte oder Arrays, die auftreten können, serialisieren, wodurch das lästige [object Object] vermieden wird.
Da Tag-Template-Literale nur Zucker für Funktionsaufrufe sind, können Sie das obige als einen äquivalenten Funktionsaufruf umschreiben:
Dies kann an die console.log-Art der Interpolation erinnern:
Sie können sehen, wie das Tag-Template natürlicher gelesen wird als eine traditionelle "Formatter"-Funktion, bei der die Variablen und das Template selbst separat deklariert werden müssen.
Zusätzlich zu normalen Zeichen können Sie auch Sonderzeichen in Strings einschließen, wie im folgenden Beispiel gezeigt.
Die folgende Tabelle listet die Sonderzeichen auf, die Sie in JavaScript-Strings verwenden können.
| \0 | Null-Byte |
| \b | Rückschritt |
| \f | Form Feed |
| \n | Zeilenumbruch |
| \r | Wagenrücklauf |
| \t | Tab |
| \v | Vertikaltabulator |
| \' | Apostroph oder einfaches Anführungszeichen |
| \" | Doppelte Anführungszeichen |
| \\ | Rückwärtsstrichzeichen |
| \XXX | Das Zeichen mit der Latin-1-Codierung, die durch bis zu drei oktale Ziffern XXX zwischen 0 und 377 angegeben wird. Zum Beispiel ist \251 die oktale Sequenz für das Copyright-Symbol. |
| \xXX | Das Zeichen mit der Latin-1-Codierung, die durch die beiden hexadezimalen Ziffern XX zwischen 00 und FF angegeben wird. Zum Beispiel ist \xA9 die hexadezimale Sequenz für das Copyright-Symbol. |
| \uXXXX | Das Unicode-Zeichen, das durch die vier hexadezimalen Ziffern XXXX angegeben wird. Zum Beispiel ist \u00A9 die Unicode-Sequenz für das Copyright-Symbol. Siehe Unicode Escape-Sequenzen. |
| \u{XXXXX} | Unicode-Codepunkt-Escapes. Zum Beispiel ist \u{2F804} dasselbe wie die Unicode-Escapes \uD87E\uDC04. |
Für Zeichen, die nicht in der Tabelle aufgelistet sind, wird ein vorausgehender Backslash ignoriert, aber diese Verwendung ist veraltet und sollte vermieden werden.
Sie können ein Anführungszeichen innerhalb eines Strings einfügen, indem Sie es mit einem Backslash versehen. Dies wird als Escaping des Anführungszeichens bezeichnet. Zum Beispiel:
Das Ergebnis davon wäre:
He read "The Cremation of Sam McGee" by R.W. Service.Um einen literalen Rückwärtsschrägstrich innerhalb eines Strings einzuschließen, müssen Sie das Rückwärtsschrägstrichzeichen escapen. Zum Beispiel, um den Dateipfad c:\temp einer Zeichenfolge zuzuweisen, verwenden Sie Folgendes:
Sie können auch Zeilenumbrüche escapen, indem Sie ihnen einen Rückwärtsschrägstrich voranstellen. Der Rückwärtsschrägstrich und der Zeilenumbruch werden beide aus dem Wert der Zeichenfolge entfernt.
Dieses Kapitel konzentriert sich auf die grundlegende Syntax für Deklarationen und Typen. Um mehr über die Sprachkonstrukte von JavaScript zu erfahren, lesen Sie auch die folgenden Kapitel in diesem Leitfaden:
Im nächsten Kapitel werfen wir einen Blick auf Kontrollflusskonstrukte und Fehlerbehandlung.
Der Bauplan für ein besseres Internet.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.