Was macht der Komma-Operator in JavaScript?

Lesezeit: 5 Minuten

Wenn ich verwende:

1.09 * 1; // returns "1.09"

Aber wenn ich benutze:

1,09 * 1; // returns "9"

Ich weiß, dass 1,09 keine Zahl ist.

Was macht das Komma im letzten Codeabschnitt?

Mehr Beispiele

if (0,9) alert("ok"); // alert
if (9,0) alert("ok"); // don't alert

alert(1); alert(2); alert(3); // 3 alerts
alert(1), alert(2), alert(3); // 3 alerts too

alert("2",
    foo = function (param) {
        alert(param)
    },
    foo('1')
)
foo('3'); // alerts 1, 2 and 3

  • Ich bin überrascht, dass 09 nicht für illegale ‘9’ im Oktalliteral fehlschlägt.

    – rekursiv

    24. August 2010 um 21:11 Uhr

  • @recursive – jede 9 in oktaler Darstellung führt zu einem Fallback auf dezimal.

    – Yuval Adam

    24. August 2010 um 21:14 Uhr

  • Verwechseln Sie nicht das Komma in einer Argumentliste. alert nimmt nur ein Argument. Alles danach wird verworfen.

    – Andreas

    25. August 2010 um 1:42 Uhr

  • @Andrew: ja, wird von alert() verworfen, das nimmt nur ein Argument, aber es wird ausgeführt! Das ist seltsam. Vielen Dank.

    – Topera

    25. August 2010 um 1:43 Uhr

  • @Topera: nicht wirklich seltsam, wenn man es aus der Perspektive von JS betrachtet. In JS müssen Sie Ihre Argumentliste nicht in Ihrer Funktionsdeklaration angeben (Sie können die arguments Objekt, das beliebig lang sein kann). Selbst mit modernem kompiliertem JS gäbe es keine Möglichkeit, im Voraus zu sagen, wie viele Argumente eine Funktion benötigen würde. Bedenken Sie: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ; Der Interpreter müsste wissen, wie die Funktion verwendet wird, um zu wissen, wie viele Argumente dafür benötigt werden. Stattdessen wertet es alles aus.

    – Andreas

    25. August 2010 um 2:05 Uhr

Benutzer-Avatar
Yuval Adam

Der Kommaoperator wertet seine beiden Operanden (von links nach rechts) aus und gibt den Wert des zweiten Operanden zurück.

Quelle: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

Zum Beispiel der Ausdruck 1,2,3,4,5 wertet zu 5. Offensichtlich ist der Kommaoperator nur für Operationen mit Seiteneffekten nützlich.

console.log(1,2,3,4,5);
console.log((1,2,3,4,5));

  • Sie haben es von C übernommen. Ich denke, es ist nur für Ausdrücke nützlich, die Nebenwirkungen haben.

    – Radomir Dopieralski

    24. August 2010 um 21:11 Uhr

  • Ich kann mir nicht viele Fälle vorstellen, in denen der Kommaoperator verwendet wird, um Zeichen zu speichern (minifizieren) oder Code zu verschleiern.

    – Benutzer17753

    30. Januar 2013 um 21:55 Uhr

  • @ user17753 Es kann legitim im durch Semikolons getrennten Abschnitt von a verwendet werden for Schleife.

    – Cyoce

    24. März 2017 um 7:33 Uhr

  • @Cyoce: Das stimmt zwar, aber im Allgemeinen wird eine solche Logik im Schleifenkörper deutlicher ausgeführt. Einige Leute werden dann behaupten, dass ihr Weg mehrere zulässt continue Punkte ohne Verdoppelung, aber dann sollten Sie nicht mehrere haben continue Punkte.

    – Leichtigkeitsrennen im Orbit

    21. März 2018 um 12:15 Uhr


  • @ user17753 Du bist auf dem Geld; Ich bin hier, weil ich versuche, einen kleinen Ausschnitt aus minimiertem Code zu verstehen

    – Selten ‘Wo ist Monica’ Needy

    20. Mai 2020 um 22:25 Uhr


Benutzer-Avatar
Douglas

Noch etwas zu beachten:

console.log((0, 9));
console.log((9, 0));
console.log(("foo", "bar"));

  • @Andrew: Hoppla, ich habe meine Antwort mit dem aktualisiert, was ich verwenden wollte.

    – Douglas

    25. August 2010 um 8:44 Uhr

  • Der Kommaoperator wertet jeden seiner Operanden (von links nach rechts) aus und gibt den Wert von zurück last Operand.

    – xgqfrms

    15. Juni 2017 um 16:30 Uhr

Hinzufügen/Ändern von Eigenschaften zu einem Objekt und Zurückgeben in der gleichen Zeile ist ein möglicher Anwendungsfall:

console.log(
  ((x) => (o = {biggerCond: r => r >= x},
           o.r5 = Array.from(window.crypto.getRandomValues(new Uint16Array(5))),
           o.isAnyBigger = o.r5.some(o.biggerCond),
           o.bigger = o.isAnyBigger ? o.r5.filter(o.biggerCond) : [x], o )
  )(5e4)
);
// Example
// {
//   bigger: [58414, 56500, 63397],
//   isAnyBigger: true,
//   isBiggerCond: r => r >= x,
//   r5: [58414, 12015, 56500, 63397, 43861]
// }

Die obige anonyme Funktion gibt ein Objekt mit zufälligen Werten zurück, die größer als der Eingabewert sind, oder, falls es keinen gibt, mit dem Eingabewert selbst in einem Array, das in enthalten ist bigger Eigentum.

Es ist immer noch syntaktischer Zucker (wie Pfeilfunktionen), aber es verkürzt die Anzahl der Zeilen … Ich frage mich, ob einige JS-Minifier den Code auf ähnliche Weise automatisch erkennen und anpassen. Führen Sie es in Ihrer Konsole aus:

((x)=>(o={biggerCond:r=>r>=x},o.r5=Array.from(window.crypto.getRandomValues(new Uint16Array(5))),o.isAnyBigger=o.r5.some(o.biggerCond),o.bigger=o.isAnyBigger?o.r5.filter(o.biggerCond):[x],o))(5e4)

  • Aber natürlich würden Sie solche kryptischen Beschwörungsformeln nicht in den Produktionscode einbauen, oder?

    – Leichtigkeitsrennen im Orbit

    21. März 2018 um 12:16 Uhr

  • @LightnessRacesinOrbit Nun, ich sage, es hängt vom Zweck ab (z. B. Unterrichten, Kürzen von Code, keine Variablen- / Funktionsdeklarationen usw.). Wenn Sie es wie oben einrücken, ist es perfekt lesbar … Ich kann nicht aufhören zu bemerken, dass Sie das Wort “kryptisch” verwendet haben 🙂

    – CPHPython

    21. März 2018 um 12:21 Uhr

  • Heh, das war nicht mal Absicht 😂

    – Leichtigkeitsrennen im Orbit

    21. März 2018 um 12:23 Uhr

Die spezifische Syntax ermöglicht es Ihnen Funktional Brot backen und dem Kunden zum Verzehr mit nein übergeben returns.

(new Array(3)).fill()
.map(()=>({state:"dough", bake(){this.state="baked"}, consume(){this.state="consumed"}}))

.map(bread=>(console.log(`Adding ${bread.state} to oven.`), bread.bake(), bread))
.map(bread=>(console.log(`Consuming ${bread.state} bread.`), bread.consume(), bread))
.map(bread=>console.log(`Bread is now ${bread.state}.`))
Adding dough to oven.
Adding dough to oven.
Adding dough to oven.
Consuming baked bread.
Consuming baked bread.
Consuming baked bread.
Bread is now consumed.
Bread is now consumed.
Bread is now consumed.

Benutzer-Avatar
dhh

Guck mal hier – das Komma steht für mehrere Ausdrücke/Anweisungen. In Ihrem Code könnten Sie beispielsweise eine Zeile wie diese verwenden:

var a=0, b=0, c=0;

Dies würde alle drei Variablen deklarieren, ohne Folgendes zu schreiben:

var a=0;
var b=0;
var c=0;

Ich hoffe, das hilft.

  • Es ist ein bisschen alt, aber wichtig zu beachten: (1) Das von Ihnen bereitgestellte Beispiel verwendet nicht den Kommaoperator (var Deklarationen verwenden kein Komma Operator, obwohl es ein Komma ist) und (2) Sie können Anweisungen nicht mit den Komma-Operatoren trennen; nur Ausdrücke sind erlaubt.

    – Qantas 94 Schwer

    26. April 2014 um 9:49 Uhr


  • Es ist ein bisschen alt, aber wichtig zu beachten: (1) Das von Ihnen bereitgestellte Beispiel verwendet nicht den Kommaoperator (var Deklarationen verwenden kein Komma Operator, obwohl es ein Komma ist) und (2) Sie können Anweisungen nicht mit den Komma-Operatoren trennen; nur Ausdrücke sind erlaubt.

    – Qantas 94 Schwer

    26. April 2014 um 9:49 Uhr


1018710cookie-checkWas macht der Komma-Operator in JavaScript?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy