Am häufigsten setzt man für den Aufbau komplexer Ausdrücke aus einfachen Ausdrücken Operatoren ein. Ein Operator kombiniert die Werte seiner Operanden (üblicherweise zwei) auf bestimmte Weise und wird zu einem neuen Wert ausgewertet. Der Multiplikationsoperator *
ist ein einfaches Beispiel. Der Ausdruck x * y
wird zum Produkt der Werte der Ausdrücke x
und y
ausgewertet. Der Einfachheit halber sagen wir gelegentlich, dass ein Operator einen Wert zurückliefert, nicht »er wird zu einem Wert ausgewertet«.
Die einfachsten Ausdrücke, die auch als elementare Ausdrücke bezeichnet werden, sind die, die eigenständig sind – d.h., sie können nicht in weitere elementare Ausdrücke zerlegt werden. Elementare Ausdrücke sind in JavaScript konstante oder literale Werte, einige Schlüsselwörter der Sprache und Variablenreferenzen.
Literale sind konstante Werte, die unmittelbar in Ihr Programm eingebettet sind. Sie sehen beispielsweise so aus:
1.23 // Ein Zahlliteral "hello" // Ein Stringliteral /pattern/ // Ein Regex-Literal
Reservierte Wörter wie true
, false
, null
und this
gelten ebenfalls als elementare Ausdrücke.
Die dritte Art von elementarem Ausdruck schließlich sind einfache Variablenreferenzen:
i // Wird zum Wert der Variablen i ausgewertet. sum // Wird zum Wert der Variablen sum ausgewertet.
Erscheint ein Bezeichner unabhängig in einem Programm, geht JavaScript davon aus, dass es sich um eine Variable handelt. Gibt es keine Variable dieses Namens, wird der Ausdruck zum Wert undefined
ausgewertet. Im Strict-Modus von ECMAScript 5 führt der Versuch, eine Variable auszuwerten, die es nicht gibt, stattdessen jedoch zu einem ReferenceError.
Objekt- und Array-Initialisierer sind Ausdrücke, deren Wert ein neu erzeugtes Objekt oder Array ist. Diese Initialisierungsausdrücke werden gelegentlich auch als »Objektliterale« und »Array-Literale« bezeichnet. Im Unterschied zu echten Literalen sind diese jedoch keine elementaren Ausdrücke, weil sie mehrere Teilausdrücke enthalten, die Eigenschafts- und Elementwerte angeben.
Ein Array-Initialisierer ist eine durch Kommata getrennte Liste von Ausdrücken in eckigen Klammern. Der Wert eines Array-Initialisierers ist ein neu erzeugtes Array. Die Elemente dieses neuen Arrays sind auf die Werte der durch Kommata getrennten Ausdrücke initialisiert:
[] // Ein leeres Array [1+2,3+4] // Ein Array mit zwei Elementen. Das erste Element ist // 3, das zweite 7.
Die Elementausdrücke in einem Array-Initialisierer können selbst auch wieder Array-Initialisierer sein, was bedeutet, dass diese Ausdrücke geschachtelte Arrays erstellen können:
var matrix = [[1,2,3], [4,5,6], [7,8,9]];
Nach dem letzten Ausdruck in einem Array-Initialisierer ist ein nachstehendes Komma erlaubt.
Objektinitialisierungsausdrücke ähneln Array-Initialisierungsausdrücken, stehen statt in eckigen Klammern aber in geschweiften Klammern. Außerdem werden jedem Teilausdruck ein Eigenschaftsname und ein Doppelpunkt vorangestellt:
var p = { x:2, y:1 }; // Ein Objekt mit zwei Eigenschaften. var q = {}; // Ein leeres Objekt ohne // Eigenschaften. q.x = 2; q.y = 1; // Jetzt hat q die gleichen // Eigenschaften wie p.
Objektliterale können ebenfalls geschachtelt werden. Zum Beispiel:
var rectangle = { upperLeft: { x: 2, y: 2 }, lowerRight: { x: 4, y: 5 } };
Die Ausdrücke in Objekt- und Array-Initialisierern werden jedes Mal ausgewertet, wenn der Objektinitialisierer ausgewertet wird und müssen keine konstanten Werte haben: Es können beliebige JavaScript-Ausdrücke sein. Außerdem können die Eigenschaftsnamen in Objektliteralen Zeichenketten (mit impliziten Anführungszeichen) statt Bezeichner sein (was nützlich sein kann, wenn man Eigenschaftsnamen angeben muss, die reservierte Wörter sind oder die aus anderem Grund keine zulässigen Bezeichner darstellen):
var side = 1; var square = { "ul": { x: p.x, y: p.y }, 'lr': { x: p.x + side, y: p.y + side}};
Auf Eigenschaften zugreifen
Der Eigenschaftszugriffsausdruck wird zum Wert einer Objekteigenschaft oder eines Array-Elements ausgewertet. JavaScript definiert zwei Syntaxformen für den Eigenschaftszugriff:
Ausdruck
.
Bezeichner Ausdruck [
Ausdruck ]
Bei der ersten Art des Eigenschaftszugriffs wird ein Ausdruck genutzt, auf den ein Punkt und dann ein Bezeichner folgen. Der Ausdruck gibt das Objekt an und der Bezeichner den Namen der gewünschten Eigenschaft. Bei der zweiten Art des Eigenschaftszugriffs folgt auf den ersten Ausdruck (das Objekt oder Array) ein weiterer Ausdruck in eckigen Klammern. Dieser zweite Ausdruck gibt den Namen der gewünschten Eigenschaft oder den Index des gewünschten Array-Elements an. Hier sind einige konkrete Beispiele:
var o = {x:1,y:{z:3}}; // Ein Beispielobjekt. var a = [o,4,[5,6]]; // Ein Array, das o enthält. o.x // => 1: Eigenschaft x des Ausdrucks o. o.y.z // => 3: Eigenschaft z des Ausdrucks o.y. o["x"] // => 1: Eigenschaft x des Objekts o. a[1] // => 4: Das Element beim Index 1 des // Ausdrucks a. a[2]["1"] // => 6: Das Element beim Index 1 des // Ausdrucks a[2]. a[0].x // => 1: Eigenschaft x des Ausdrucks a[0].
Die .Bezeichner
-Syntax ist die einfachere der beiden Optionen für den Eigenschaftszugriff. Beachten Sie jedoch, dass sie nur eingesetzt werden kann, wenn die Eigenschaft, auf die Sie zugreifen wollen, einen Namen hat, der ein zulässiger Bezeichnername ist, und wenn Sie den Namen des Bezeichners bereits beim Schreiben des Programms kennen. Wenn der Eigenschaftsname einem reservierten Wort entspricht, Leerzeichen oder Interpunktionszeichen enthält oder eine Zahl ist (bei Arrays), müssen Sie die Notation mit den eckigen Klammern verwenden. Eckige Klammern werden auch genutzt, wenn der Eigenschaftsname nicht statisch, sondern selbst das Ergebnis einer Berechnung ist.
Ein Funktionsdefinitionsausdruck definiert eine JavaScript-Funktion, und der Wert eines solchen Ausdrucks ist die neu definierte Funktion. In gewisser Weise ist ein Funktionsdefinitionsausdruck ein »Funktionsliteral«, ähnlich wie ein Objektinitialisierer ein »Objektliteral« ist. Ein Funktionsdefinitionsausdruck besteht üblicherweise aus dem Schlüsselwort function
, einer kommaseparierten Liste weiterer Bezeichner (den Parameternamen) in Klammern und einem Block JavaScript-Code (dem Funktionsrumpf) in geschweiften Klammern. Zum Beispiel:
// Diese Funktion liefert das Quadrat des übergebenen Werts. var square = function(x) { return x * x; }
Funktionen können auch mit einer Funktionsanweisung statt einem Funktionsausdruck definiert werden. Vollständige Informationen zu Funktionsdefinitionen finden Sie in Chapter 7.
Als Aufrufausdruck bezeichnet man JavaScripts Syntax für den Aufruf (oder die Ausführung) einer Funktion oder Methode. Sie beginnt mit einem Funktionsausdruck, der die aufzurufende Funktion bezeichnet. Auf den Funktionsausdruck folgen eine öffnende Klammer, eine kommagetrennte Liste mit null oder mehr Argumenten und eine schließende Klammer. Ein paar Beispiele:
f(0) // f ist der Funktionsausdruck; // 0 ist der Argumentausdruck. Math.max(x,y,z) // Math.max ist die Funktion; // x, y und z sind die Argumente. a.sort() // a.sort ist die Funktion; es gibt // keine Argumente.
Wird ein Aufrufausdruck ausgewertet, wird zuerst der Funktionsausdruck ausgewertet. Anschließend werden die Argumentausdrücke ausgewertet, um...