Gruppierungsoperator ( )
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
Der Gruppierungsoperator ( ) steuert die Auswertungsreihenfolge in Ausdrücken. Er fungiert auch als Container für beliebige Ausdrücke in bestimmten syntaktischen Konstrukten, wo ansonsten Ambiguität oder Syntaxfehler auftreten würden.
Probieren Sie es aus
console.log(1 + 2 * 3); // 1 + 6
// Expected output: 7
console.log(1 + (2 * 3)); // 1 + 6
// Expected output: 7
console.log((1 + 2) * 3); // 3 * 3
// Expected output: 9
console.log(1 * 3 + 2 * 3); // 3 + 6
// Expected output: 9
Syntax
(expression)
Parameter
expression-
Jeder Ausdruck, der ausgewertet werden soll, einschließlich komma-getrennter Ausdrücke.
Beschreibung
Der Gruppierungsoperator besteht aus einem Paar Klammern um einen Ausdruck, das die Inhalte gruppiert. Der Operator setzt die normale Operatorpräzedenz außer Kraft, sodass Operatoren mit niedrigerer Präzedenz (so niedrig wie der Komma-Operator) vor einem Operator mit höherer Präzedenz ausgewertet werden können.
Beispiele
>Verwendung des Gruppierungsoperators
Addition und Subtraktion werden vor Multiplikation und Division ausgewertet.
const a = 1;
const b = 2;
const c = 3;
// default precedence
a + b * c; // 7
// evaluated by default like this
a + (b * c); // 7
// now overriding precedence
// addition before multiplication
(a + b) * c; // 9
// which is equivalent to
a * c + b * c; // 9
Beachten Sie in diesen Beispielen, dass sich die Reihenfolge, in der die Operatoren ausgewertet werden, geändert hat, nicht jedoch die Reihenfolge, in der die Operanden ausgewertet werden. Zum Beispiel werden in diesem Code die Funktionsaufrufe a(), b(), und c() von links nach rechts (die normale Auswertungsreihenfolge) ausgewertet, bevor die Operatorreihenfolge berücksichtigt wird.
a() * (b() + c());
Die Funktion a wird vor der Funktion b aufgerufen, die wiederum vor der Funktion c aufgerufen wird. Weitere Informationen zur Operatorpräzedenz finden Sie auf der Referenzseite.
Verwenden des Gruppierungsoperators zur Beseitigung von Parsing-Mehrdeutigkeiten
Ein Ausdrucksstaatssatz kann nicht mit dem Schlüsselwort function beginnen, da der Parser dies als Beginn einer Funktionsdeklaration ansehen würde. Dies bedeutet, dass die folgende IIFE-Syntax ungültig ist:
function () {
// code
}();
Der Gruppierungsoperator kann verwendet werden, um diese Ambiguität zu beseitigen, da der Parser bei Anblick der linken Klammer weiß, dass das Folgende ein Ausdruck und keine Deklaration sein muss.
(function () {
// code
})();
Sie können auch den void Operator verwenden, um Ambiguitäten zu beseitigen.
In einem Arrow-Funktions-Ausdruckskörper (einer, der direkt einen Ausdruck ohne das Schlüsselwort return zurückgibt) kann der Gruppierungsoperator verwendet werden, um ein Objektliteral zurückzugeben, da sonst die linke geschweifte Klammer als Beginn des Funktionskörpers interpretiert würde.
const f = () => ({ a: 1 });
Wenn auf ein Zahlenliteral eine Eigenschaft zugegriffen wird, kann der Eigenschafts-Zugriffs-Operator Punkt . mit einem Dezimalpunkt verwechselt werden, es sei denn, die Zahl hat bereits einen Dezimalpunkt. Sie können ganze Zahlenliterale in Klammern setzen, um diese Ambiguität zu beseitigen.
(1).toString(); // "1"
Gruppierungsoperator und automatische Semikolon-Einfügung
Der Gruppierungsoperator kann automatische Semikolon-Einfügungs (ASI) Probleme abmildern. Zum Beispiel können das return-Schlüsselwort und der zurückgegebene Ausdruck keinen Zeilenumbruch enthalten:
function sum(a, b) {
return
a + b;
}
Dieser Code wird undefined zurückgeben, da ein Semikolon direkt nach dem return-Schlüsselwort eingefügt wird, was dazu führt, dass die Funktion sofort zurückkehrt, ohne a + b auszuwerten. Wenn der zurückgegebene Ausdruck lang ist und Sie ihn gut formatiert halten möchten, können Sie den Gruppierungsoperator verwenden, um anzuzeigen, dass dem return-Schlüsselwort ein Ausdruck folgt, und um die Semikolon-Einfügung zu verhindern:
function sum(a, b) {
return (
a + b
);
}
Gruppierungen können jedoch auch ASI-Gefahren einführen. Wenn eine Zeile mit einer linken Klammer beginnt und die vorherige Zeile mit einem Ausdruck endet, fügt der Parser vor dem Zeilenumbruch kein Semikolon ein, da es sich um die Mitte eines Funktionsaufrufs handeln könnte. Zum Beispiel:
const a = 1
(1).toString()
Dieser Code würde so geparst werden:
const a = 1(1).toString();
Was "TypeError: 1 is not a function" auslöst. Wenn Ihr Coding-Stil keine Semikolons verwendet, denken Sie daran, dass Sie, wenn eine Zeile mit einer linken Klammer beginnt, sie mit einem Semikolon voranstellen sollten. Diese Praxis wird von mehreren Formatierern und/oder Stilrichtlinien empfohlen, darunter Prettier und standard.
const a = 1
;(1).toString()
Weitere Ratschläge zum Umgang mit ASI finden Sie in der Referenzsektion.
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-grouping-operator> |