Funktioniert die Zuweisung mit einem Komma?

108

Warum funktioniert aaa = 1,2,3und setzt den Wert von aaaauf 1?

Warum funktioniert das nicht var bbb = 1,2,3?

Warum funktioniert var bbb = (1,2,3)und setzt den Wert von bbbauf 3?

Beispiel für eine Konsolensitzung

Shankar Cabus
quelle
9
Sie erhalten den Syntaxfehler, weil Variablennamen nicht mit einer Zahl beginnen dürfen. var a1,a2,a3;deklariert einfach drei lokale Variablen.
Jared Farrish

Antworten:

200

Hier ist viel los, aber im Grunde kommt es auf den Komma-Operator an .

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


Dieser Code:

aaa = 1,2,3

Ist äquivalent zu:

aaa = 1;
2;
3;

Es aaawird also implizit deklariert und der Wert 1 zugewiesen. Beachten Sie, dass die Ausgabe auf der Konsole das Ergebnis der letzten Anweisung 3 ist.


Dieser Code:

var bbb = 1,2,3

Ist ein Syntaxfehler, da Kommas in Variablendeklarationen verwendet werden, um mehrere Variablen in einer einzelnen Zeile zu deklarieren. Wie der MDN-Artikel hervorhebt,

Beachten Sie, dass das Komma in der varAnweisung nicht der Kommaoperator ist, da es in einem Ausdruck nicht vorhanden ist. Es ist vielmehr ein Sonderzeichen in varAussagen, mehrere davon zu einem zu kombinieren.

Dieser Code entspricht also in etwa:

var bbb = 1;
var 2;
var 3;

Natürlich 2ist keine gültige Kennung, so dass es an diesem Punkt fehlschlägt.


Dieser Code:

var bbb = (1,2,3)

Ist der ersten sehr ähnlich, außer dass die numerischen Werte in Klammern gesetzt werden und zuerst ausgewertet werden. Das ist also ungefähr gleichbedeutend mit:

1;
2;
var bbb = 3;
pswg
quelle
17
Darüber hinaus ist das =in var bbb = 1;nicht dasselbe =wie in aaa = 1;- sie stammen aus verschiedenen Produktionen (Initialiser vs AssignmentExpression) in der Grammatik und verwenden zufällig dasselbe Token.
Ryan Cavanaugh
7
Sehr schöne Erklärung. Was nicht ganz explizit war, war, dass a = 1, 2, 3in Klammern gesetzt werden kann, als (a = 1), 2, 3was ausgewertet wird a = 1; 2; 3(und 3 zurückgibt, z. B. b = (a = 1, 2, 3)3 zu b zuweisen würde). Im Gegensatz dazu a = (1, 2, 3)bewertet als 1; 2; a = 3und gibt 3 zurück.
CompuChip
Was sagt das MDN über Parens bei der Variablenzuweisung und warum ist es umgekehrt? Ich konnte den Doc nicht finden
Brian
@staticx Nichts wird wirklich "umgekehrt" gemacht. Die Klammern werden zuerst ausgewertet. Genau wie wenn Sie (1 + 2) * 3, die 1 + 2zuerst und das Ergebnis dieser Ausdruck ausgewertet wird wieder in den äußeren Ausdruck für den Rest der Auswertung ersetzt.
Pswg
9

Komma wird in Javascript mehrfach verwendet. Im Ausdruck:

a = 1, 2, 3;

Es ist ein Operator, der einfach sein rechtes Argument zurückgibt. Es ist aber auch Teil der Syntax von varDeklarationen:

var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;

(wobei [...]bedeutet, dass der Teil optional ist). In Ihrer varDeklaration fehlen die Variablennamen nach den Kommas, sodass sie nicht analysiert werden. Sie könnten den gewünschten Effekt erzielen mit:

var a = (1, 2, 3);

Die Klammern erzwingen, dass die Kommas als Operatoren und nicht als Trennzeichen zwischen Variablendeklarationen behandelt werden.

Barmar
quelle
7

In Ihren Beispielen wird das Komma in zwei Zusammenhängen verwendet:

var Aussage

Die Syntax der varAnweisung lautet:

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

Hier wird Komma verwendet, um Variablenname-Wert-Paare zu trennen. Folgendes funktioniert nicht, da ein Variablenname nicht mit einer Ziffer beginnen kann (siehe Bezeichnernamen ):

var bbb = 1, 2, 3;
// SyntaxError: Unexpected number

Komma-Operator

Der Kommaoperator wertet beide Operanden aus (von links nach rechts) und gibt den Wert des zweiten Operanden zurück. Die folgenden Ausdrücke funktionieren wie folgt:

aaa = 1, 2, 3;
  • aaa = 1, 2 ergibt 2
    • Beachten Sie, dass dies aaa = 1zuerst ausgewertet wird, da es =eine höhere Priorität als hat,
  • 2, 3 ergibt 3
var bbb = (1, 2, 3);
  • der Ausdruck (1, 2, 3)ergibt 3wie oben beschrieben
  • Der Variablen bbbwird der Wert zugewiesen3
Salman A.
quelle
2
aaa = 1, 2, 3=> Der Komma - Operator wird verwendet , um die folgenden drei Aussagen zu trennen: aaa=1, 2und 3. Das Ergebnis des Kommaoperators ist der Wert der letzten Anweisung 3. aaa wird jedoch der Wert 1 zugewiesen, wie aus dem Screenshot des OP deutlich hervorgeht. Der Grund dafür ist die Operator-Priorität, wobei der Komma-Operator die niedrigste Priorität hat.
Tibos
1

Im ersten Fall:

aaa = 1,2,3

Die Kommas dienen als Ausdruckstrennzeichen. Es führt eine Zuordnung zu aus aaa, berechnet 2und verwirft sie dann, berechnet 3und verwirft sie.

In dieser Sekunde:

var bbb = 1,2,3

Das varSchlüsselwort teilt dem Javascript-Compiler mit, dass das nächste nach a ein ,anderer Variablenname sein sollte. Es findet nicht weiter, also stirbt es und würgt.

var bbb = (1,2,3)

Hier wertet der Compiler dies zuerst aus 1und ignoriert es. Dann wertet es aus 2und ignoriert es. Dann wird es ausgewertet 3und das bleibt auf dem Stapel, so dass es zugewiesen wirdbbb

Während die Verwendung von Kommas zum Trennen von Ausdrücken nicht üblich ist, ist sie manchmal in Dingen wie dem forAussehen nützlich .

for (i = 0, l = 10; i < l; i++) {
  console.log(i);
}
Jeremy J Starcher
quelle