Gruppierungsoperator ( )

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Der Gruppierungsoperator ( ) steuert die Vorrangigkeit der Auswertung in Ausdrücken. Er fungiert auch als Container für beliebige Ausdrücke in bestimmten syntaktischen Konstrukten, in denen sonst Mehrdeutigkeiten oder Syntaxfehler auftreten würden.

Probieren Sie es aus

Syntax

js
(expression)

Parameter

expression

Jeder beliebige Ausdruck, der ausgewertet werden soll, einschließlich komma-getrennter Ausdrücke.

Beschreibung

Der Gruppierungsoperator besteht aus einem Paar von Klammern um einen Ausdruck, der den Inhalt gruppiert. Der Operator setzt die normale Operator-Priorität außer Kraft, sodass Operatoren mit niedriger Priorität (so niedrig wie der Kommaoperator) vor einem Operator mit höherer Priorität ausgewertet werden können.

Beispiele

Verwendung des Gruppierungsoperators

Auswertung von Addition und Subtraktion vor Multiplikation und Division.

js
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 in diesem Code werden die Funktionsaufrufe a(), b() und c() von links nach rechts (die normale Auswertungsreihenfolge) ausgewertet, bevor die Reihenfolge der Operatoren in Betracht gezogen wird.

js
a() * (b() + c());

Die Funktion a wird vor der Funktion b aufgerufen, die vor der Funktion c aufgerufen wird. Weitere Informationen zur Operator-Priorität finden Sie auf der Referenzseite.

Verwendung des Gruppierungsoperators zur Beseitigung von Parser-Mehrdeutigkeiten

Ein Ausdrucksstatement kann nicht mit dem Schlüsselwort function beginnen, da der Parser es als Beginn einer Funktionsdeklaration interpretieren würde. Dies bedeutet, dass die folgende IIFE-Syntax ungültig ist:

js
function () {
  // code
}();

Der Gruppierungsoperator kann verwendet werden, um diese Mehrdeutigkeit zu beseitigen, da, wenn der Parser die linke Klammer sieht, er weiß, dass das Folgende ein Ausdruck und keine Deklaration sein muss.

js
(function () {
  // code
})();

Sie können auch den void-Operator verwenden, um Mehrdeutigkeiten zu beseitigen.

In einem Ausdruckskörper einer Arrowfunktion (einer, der direkt einen Ausdruck ohne das Schlüsselwort return zurückgibt) kann der Gruppierungsoperator verwendet werden, um einen Objektliteral-Ausdruck zurückzugeben, da ansonsten die linke geschweifte Klammer als Beginn des Funktionskörpers interpretiert würde.

js
const f = () => ({ a: 1 });

Wenn eine Eigenschaft auf einem Zahlenliteral zugegriffen wird, kann der Eigenschafts-Accessor-Punkt . mit einem Dezimalpunkt mehrdeutig sein, es sei denn, die Zahl hat bereits einen Dezimalpunkt. Sie können ganzzahlige Literale in Klammern setzen, um diese Mehrdeutigkeit zu beseitigen.

js
(1).toString(); // "1"

Gruppierungsoperator und automatische Semiklon-Einfügung

Der Gruppierungsoperator kann Fallstricke der automatischen Semikolon-Einfügung (ASI) mindern. Zum Beispiel dürfen das Schlüsselwort return und der zurückgegebene Ausdruck keinen Zeilenumbruch dazwischen haben:

js
function sum(a, b) {
  return
    a + b;
}

Dieser Code wird undefined zurückgeben, da direkt nach dem return-Schlüsselwort ein Semikolon eingefügt wird, was dazu führt, dass die Funktion sofort zurückkehrt, ohne a + b auszuwerten. Falls der zurückgegebene Ausdruck lang ist und Sie ihn gut formatiert halten möchten, können Sie den Gruppierungsoperator verwenden, um anzugeben, dass dem return-Schlüsselwort ein Ausdruck folgt, und Semikolon-Einfügung verhindern:

js
function sum(a, b) {
  return (
    a + b
  );
}

Gruppierung kann jedoch auch ASI-Gefahren einführen. Wenn eine Zeile mit einer linken Klammer beginnt und die vorherige Zeile mit einem Ausdruck endet, wird der Parser keinen Semikolon vor dem Zeilenumbruch einfügen, da dies die Mitte eines Funktionsaufrufs sein könnte. Zum Beispiel:

js
const a = 1
(1).toString()

Dieser Code würde so geparst werden:

js
const a = 1(1).toString();

Was "TypeError: 1 is not a function" auslöst. Wenn Ihr Codierstil keine Semikolons verwendet, denken Sie daran, dass, wenn eine Zeile mit einer linken Klammer beginnt, präfixen Sie diese mit einem Semikolon. Diese Praxis wird von mehreren Formatierern und/oder Stilrichtlinien empfohlen, einschließlich Prettier und standard.

js
const a = 1
;(1).toString()

Für weitere Ratschläge zur ASI, siehe den Referenzabschnitt.

Spezifikationen

Specification
ECMAScript Language Specification
# sec-grouping-operator

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch