Was macht ein Komma in JavaScript-Ausdrücken?

89

Wenn ich benutze:

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 Code?

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
Topera
quelle
1
Ich bin überrascht, dass 09 nicht an der illegalen '9' im Oktal-Literal scheitert.
rekursiv
7
@recursive - Jede 9 in der Oktaldarstellung führt zu einem Fallback auf die Dezimalstelle.
Yuval Adam
Verwechseln Sie das Komma nicht in einer Argumentliste. alertnimmt nur ein Argument. Alles danach wird verworfen.
Andrew
@ Andrew: Ja, wird von alert () verworfen, das nur ein Argument akzeptiert, aber es wird ausgeführt! Das ist komisch. Vielen Dank.
Topera
1
@Topera: Nicht wirklich komisch, wenn man aus der Sicht von JS darüber nachdenkt. In JS müssen Sie Ihre Argumentliste nicht in Ihrer Funktionsdeklaration angeben (Sie können argumentsstattdessen das Objekt verwenden, das beliebig lang sein kann). Selbst mit modernem kompiliertem JS gibt es keine Möglichkeit, im Voraus zu sagen, wie viele Argumente eine Funktion annehmen würde. Bedenken Sie Folgendes: 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 er benötigen würde. Stattdessen wertet es alles aus.
Andrew

Antworten:

95

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

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

Beispielsweise wird der Ausdruck als 1,2,3,4,5ausgewertet 5. Offensichtlich ist der Komma-Operator nur für Operationen mit Nebenwirkungen nützlich.

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

Yuval Adam
quelle
2
Sie haben es von C genommen. Ich denke, es ist nur nützlich für Ausdrücke, die Nebenwirkungen haben.
Radomir Dopieralski
3
Ich kann mir nicht viele Fälle vorstellen, in denen der Komma-Operator nur für das Speichern von Zeichen (Minimieren) oder das Verschleiern von Code verwendet wird.
user17753
1
@ user17753 Es kann legitimerweise im durch Semikolons getrennten Abschnitt einer forSchleife verwendet werden.
Cyoce
1
@Cyoce: Während das stimmt, wird eine solche Logik im Allgemeinen klarer im Schleifenkörper ausgeführt. Einige Leute werden dann behaupten, dass ihr Weg mehrere continuePunkte ohne Duplizierung zulässt , aber dann sollten Sie nicht mehrere continuePunkte haben.
Leichtigkeitsrennen im Orbit
@ user17753 Du bist auf dem Geld; Der Versuch, einen kleinen Ausschnitt aus minimiertem Code zu verstehen, ist der Grund, warum ich hier bin
SeldomNeedy
6

Noch etwas zu beachten:

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

Douglas
quelle
7
Lol, es macht Spaß:alert("1", alert("2", alert("3")))
Topera
1
@ Andrew: Ups, ich habe meine Antwort mit dem aktualisiert, was ich verwenden wollte.
Douglas
Der Kommaoperator wertet jeden seiner Operanden aus (von links nach rechts) und gibt den Wert des lastOperanden zurück.
xgqfrms
2

Schauen Sie hier - das Komma steht für mehrere Ausdrücke / Anweisungen. Zum Beispiel könnten Sie in Ihrem Code eine Zeile wie diese verwenden:

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

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

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

Hoffentlich hilft das.

dhh
quelle
22
Es ist ein bisschen alt, aber wichtig zu beachten: (1) das Beispiel , das Sie zur Verfügung gestellt haben , nicht den Komma - Operator ( varErklärungen nicht das Komma Operator , auch wenn es ein Komma ist) und (2) kann man nicht trennen Anweisungen unter Verwendung der Kommaoperatoren; Es sind nur Ausdrücke zulässig.
Qantas 94 Heavy
2
Der Kommaoperator wertet beide Operanden aus (von links nach rechts) und gibt den Wert des second Operanden zurück.

https://stackoverflow.com/a/3561056/5934465

Es sollte so sein!

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

xgqfrms
quelle
4
Der Komma-Operator verwendet zwei Operanden, sodass das ursprüngliche Anführungszeichen korrekt war. Sie sprechen über das Endergebnis der Verschachtelung solcher Ausdrücke, aber dies bedeutet, dass Ihr Ersatzzitat subtil falsch formuliert ist. a,b,c,dis((((a),b),c),d)
Leichtigkeitsrennen im Orbit
0

Das Hinzufügen / Ändern von Eigenschaften zu einem Objekt und das Zurückgeben in derselben 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 keine vorhanden sind, mit dem Eingabewert selbst in einem Array, das in der enthalten ist bigger Eigenschaft enthalten ist.

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)
CPHPython
quelle
2
Aber natürlich würden Sie solche kryptischen Beschwörungsformeln nicht in den Produktionscode einfügen, oder?
Leichtigkeitsrennen im Orbit
@LightnessRacesinOrbit gut, ich werde sagen, es hängt vom Zweck ab (z. B. Lehren, Verkürzen von Code, keine Variablen- / Funktionsdeklarationen usw.). Wenn Sie es wie oben
einrücken
1
Heh, das war nicht einmal absichtlich 😂
Leichtigkeitsrennen im Orbit