Ausdrucks-Anweisung
Eine Ausdrucks-Anweisung ist ein Ausdruck, der an einer Stelle verwendet wird, an der eine Anweisung erwartet wird. Der Ausdruck wird ausgewertet und sein Ergebnis verworfen – daher macht es nur für Ausdrücke mit Nebeneffekten Sinn, wie das Ausführen einer Funktion oder das Aktualisieren einer Variable.
Syntax
expression;
expression
-
Ein beliebiger Ausdruck, der ausgewertet werden soll. Es gibt bestimmte Ausdrücke, die mit anderen Anweisungen mehrdeutig sein können und daher verboten sind.
Beschreibung
Abgesehen von den dedizierten Anweisungssyntaxen können Sie auch fast jeden Ausdruck als eigenständige Anweisung verwenden. Die Ausdrucks-Anweisungssyntax erfordert ein Semikolon am Ende, aber der Prozess der Automatischen Semikolon-Einfügung kann eines für Sie einfügen, falls das Fehlen eines Semikolons zu ungültiger Syntax führt.
Da der Ausdruck ausgewertet und dann verworfen wird, ist das Ergebnis des Ausdrucks nicht verfügbar. Daher muss der Ausdruck einen Nebeneffekt haben, um nützlich zu sein. Ausdrucks-Anweisungen sind allgemein:
- Funktionsaufrufe (
console.log("Hello");
,[1, 2, 3].forEach((i) => console.log(i));
) - Gekennzeichnete Template-Literale
- Zuweisungsausdrücke, einschließlich zusammengesetzter Zuweisungen
- Inkrement- und Dekrement-Operatoren
delete
import()
yield
undyield*
Andere können auch Nebeneffekte haben, wenn sie Getter aufrufen oder Typumwandlungen auslösen.
Verbotene Ausdrücke
Damit ein Ausdruck als Anweisung verwendet werden kann, darf er nicht mit anderen Anweisungssyntaxen mehrdeutig sein. Der Ausdruck darf daher nicht mit einem der folgenden Token beginnen:
function
: würde einefunction
-Deklaration oderfunction*
Deklaration sein, keinfunction
-Ausdruck oderfunction*
-Ausdruckasync function
: würde eineasync function
-Deklaration oderasync function*
-Deklaration sein, keinasync function
-Ausdruck oderasync function*
-Ausdruckclass
: würde eineclass
-Deklaration sein, keinclass
-Ausdrucklet[
: würde einelet
-Deklaration mit Array-Destrukturierung sein, kein Property-Accessor auf einer Variablen namenslet
(let
kann nur ein Bezeichner im nicht-strikten Modus sein){
: würde eine Blockanweisung sein, kein Objektliteral
Daher sind alle folgenden ungültig:
function foo() {
console.log("foo");
}(); // SyntaxError: Unexpected token '('
// For some reason, you have a variable called `let`
var let = [1, 2, 3];
let[0] = 4; // SyntaxError: Invalid destructuring assignment target
{
foo: 1,
bar: 2, // SyntaxError: Unexpected token ':'
};
Gefährlicher ist, dass der Code manchmal zufällig eine gültige Syntax hat, aber nicht das ist, was beabsichtigt war.
// For some reason, you have a variable called `let`
var let = [1, 2, 3];
function setIndex(index, value) {
if (index >= 0) {
// Intend to assign to the array `let`, but instead creates an extra variable!
let[index] = value;
}
}
setIndex(0, [1, 2]);
console.log(let); // [1, 2, 3]
// This is not an object literal, but a block statement,
// where `foo` is a label and `1` is an expression statement.
// This often happens in the console
{ foo: 1 };
Um diese Probleme zu vermeiden, können Sie Klammern verwenden, sodass die Anweisung eindeutig eine Ausdrucks-Anweisung ist.
(function foo() {
console.log("foo");
})();
Beispiele
Vermeidung von Kontrollfluss-Anweisungen
Sie können die Verwendung von Kontrollfluss-Anweisungen fast vollständig vermeiden, indem Sie Ausdrucks-Anweisungen verwenden. Zum Beispiel kann if...else
durch ternäre Operatoren und logische Operatoren ersetzt werden. Iterative Anweisungen wie for
oder for...of
können durch Array-Methoden ersetzt werden.
// Using control flow statements
function range(start, end) {
if (start > end) {
[start, end] = [end, start];
}
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
}
// Using expression statements
function range2(start, end) {
start > end && ([start, end] = [end, start]);
return Array.from({ length: end - start }, (_, i) => start + i);
}
Warnung: Dies demonstriert nur eine Fähigkeit der Sprache. Übermäßiger Einsatz von Ausdrucks-Anweisungen als Ersatz für Kontrollfluss-Anweisungen kann den Code viel weniger lesbar machen.
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-expression-statement |