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
(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.
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.
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:
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.
(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.
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.
(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:
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:
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:
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 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.
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