Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
Komma-Operator (,)
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Juli 2015.
DerKomma-Operator (,) wertet jeden seiner Operanden (von links nach rechts) aus und gibt den Wert des letzten Operanden zurück. Dies wird häufig verwendet, um mehrere Aktualisierungen für den Nachgedanken einerfor-Schleife bereitzustellen.
In diesem Artikel
Probieren Sie es aus
let x = 1;x = (x++, x);console.log(x);// Expected output: 2x = (2, 3);console.log(x);// Expected output: 3Syntax
expr1, expr2, expr3/* , … */Parameter
expr1,expr2,expr3, …Eine oder mehrere Ausdrücke, von denen der letzte als Wert des zusammengesetzten Ausdrucks zurückgegeben wird.
Beschreibung
Sie können den Komma-Operator verwenden, wenn Sie mehrere Ausdrücke an einer Stelle einfügen möchten, die einen einzelnen Ausdruck erfordert. Die häufigste Verwendung dieses Operators ist die Bereitstellung mehrerer Aktualisierungen in einerfor-Schleife. Für ein Idiom, das mehrereAnweisungen an einer Stelle erlaubt, die einen einzelnen Ausdruck erfordert, können Sie einIIFE verwenden.
Da alle Ausdrücke außer dem letzten ausgewertet und dann verworfen werden, müssen diese Ausdrücke Nebeneffekte haben, um nützlich zu sein. Häufige Ausdrücke mit Nebeneffekten sind Zuweisungen, Funktionsaufrufe und die++- und---Operatoren. Andere können ebenfalls Nebeneffekte haben, wenn sieGetter aufrufen oderTypumwandlungen auslösen.
Der Komma-Operator hat die niedrigstePriorität aller Operatoren. Wenn Sie einen durch Komma verbundenen Ausdruck in einen größeren Ausdruck integrieren möchten, müssen Sie ihn in Klammern setzen.
Der Komma-Operator ist völlig anders als Kommata, die als syntaktische Trennzeichen an anderen Stellen verwendet werden, einschließlich:
- Elemente in Array-Initialisierungen (
[1, 2, 3]) - Eigenschaften inObjekt-Initialisierungen (
{ a: 1, b: 2 }) - Parameter inFunktionsdeklarationen/-ausdrücken (
function f(a, b) { … }) - Argumente in Funktionsaufrufen (
f(1, 2)) - Bindungs-Listen in
let-,const- odervar-Deklarationen (const a = 1, b = 2;) - Importlisten in
import-Deklarationen (import { a, b } from "c";) - Exportlisten in
export-Deklarationen (export { a, b };)
Tatsächlich akzeptieren einige dieser Stellen fast alle Ausdrücke, aber keine durch Komma verbundenen Ausdrücke, da dies mit den syntaktischen Kommatrennzeichen mehrdeutig wäre. In diesem Fall müssen Sie den durch Komma verbundenen Ausdruck in Klammern setzen. Zum Beispiel ist die folgende eineconst-Deklaration, die zwei Variablen deklariert, wobei das Komma nicht der Komma-Operator ist:
const a = 1, b = 2;Dies unterscheidet sich vom folgenden, bei demb = 2 einZuordnungs-Ausdruck und keine Deklaration ist. Der Wert vona ist2, der Rückgabewert der Zuweisung, während der Wert von1 verworfen wird:
const a = (1, b = 2);Komma-Operatoren können nicht alsnachgestellte Kommas erscheinen.
Beispiele
>Verwendung des Komma-Operators in einer for-Schleife
Wenna ein zweidimensionales Array mit 10 Elementen auf jeder Seite ist, verwendet der folgende Code den Komma-Operator, umi zu inkrementieren undj zu dekrementieren, und druckt so die Werte der diagonalen Elemente im Array:
const a = Array.from({ length: 10 }, () => Array.from({ length: 10 }, Math.random),); // A 10×10 array of random numbersfor (let i = 0, j = 9; i <= 9; i++, j--) { console.log(`a[${i}][${j}] = ${a[i][j]}`);}Verwenden des Komma-Operators zur Verbindung von Zuweisungen
Da Kommas die niedrigstePriorität haben — sogar niedriger als Zuweisungen — können Kommas verwendet werden, um mehrere Zuweisungsausdrücke zu verbinden. Im folgenden Beispiel wirda auf den Wert vonb = 3 gesetzt (der 3 ist). Dann wird der Ausdruckc = 4 ausgewertet und sein Ergebnis wird zum Rückgabewert des gesamten Komma-Ausdrucks.
let a, b, c;a = b = 3, c = 4; // Returns 4console.log(a); // 3 (left-most)let x, y, z;x = (y = 5, z = 6); // Returns 6console.log(x); // 6 (right-most)Verarbeiten und dann zurückgeben
Ein weiteres Beispiel, das man mit dem Komma-Operator machen könnte, ist das Verarbeiten vor dem Zurückgeben. Wie erwähnt, wird nur das letzte Element zurückgegeben, aber alle anderen werden ebenfalls ausgewertet. Man könnte also Folgendes tun:
function myFunc() { let x = 0; return (x += 1, x); // the same as return ++x;}Dies ist besonders nützlich für einzeiligePfeilfunktionen. Das folgende Beispiel verwendet ein einzelnesmap(), um sowohl die Summe eines Arrays als auch die Quadrate seiner Elemente zu erhalten, was ansonsten zwei Iterationen erfordern würde, eine mitreduce() und eine mitmap():
let sum = 0;const squares = [1, 2, 3, 4, 5].map((x) => ((sum += x), x * x));console.log(squares); // [1, 4, 9, 16, 25]console.log(sum); // 15Verwerfen der Referenzbindung
Der Komma-Operator gibt immer den letzten Ausdruck alsWert statt alsReferenz zurück. Dies führt dazu, dass einige kontextuelle Informationen wie diethis-Bindung verloren gehen. Zum Beispiel gibt ein Property-Zugriff eine Referenz auf die Funktion zurück, die sich auch das Objekt merkt, auf dem es aufgerufen wird, sodass der Aufruf der Eigenschaft ordnungsgemäß funktioniert. Wenn die Methode aus einem Komma-Ausdruck zurückgegeben wird, wird die Funktion so aufgerufen, als wäre sie ein neuer Funktionswert, undthis istundefined.
const obj = { value: "obj", method() { console.log(this.value); },};obj.method(); // "obj"(obj.method)(); // "obj" (the grouping operator still returns the reference)(0, obj.method)(); // undefined (the comma operator returns a new value)Mit dieser Technik können Sie in einindirektes eval eintreten, da ein direktes eval erfordert, dass der Funktionsaufruf auf die Referenz zureval()-Funktion erfolgt.
globalThis.isDirectEval = false;{ const isDirectEval = true; console.log(eval("isDirectEval")); // true console.log((eval)("isDirectEval")); // true (the grouping operator still returns a reference to `eval`) console.log((0, eval)("isDirectEval")); // false (the comma operator returns a new value)}Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-comma-operator> |