JavaScript-Variablendefinition: Kommas vs. Semikolons

87

Was sind die Unterschiede und / oder Vorteile der Verwendung von Kommas, wenn eine Gruppe von Variablen anstelle von Semikolons deklariert wird?

Beispielsweise:

var foo = 'bar', bar = 'foo';

gegen

var foo = 'bar';
var bar = 'foo';

Ich weiß, dass, wenn Sie das varSchlüsselwort für die erste Variable im ersten Beispiel angeben, es für alle Variablen bestehen bleibt, sodass beide das gleiche Endergebnis in Bezug auf den Gültigkeitsbereich erzielen. Ist es nur eine persönliche Präferenz oder gibt es einen Leistungsvorteil, wenn man es so oder so macht?

Collin Klopfenstein
quelle

Antworten:

72

Kein Leistungsvorteil, nur eine Frage der persönlichen Wahl und des Stils.

Die erste Version ist nur prägnanter.


Aktualisieren:

In Bezug auf die Datenmenge, die über das Kabel übertragen wird, ist natürlich weniger besser, aber Sie würden verdammt viele entfernte varDeklarationen benötigen , um eine echte Auswirkung zu sehen.

Die Minimierung wurde als etwas erwähnt, bei dem das erste Beispiel für eine bessere Minimierung hilfreich sein wird. Wie Daniel Vassallo in den Kommentaren hervorhebt, wird ein guter Minifizierer dies sowieso automatisch für Sie tun, sodass diesbezüglich keinerlei Auswirkungen bestehen.

Oded
quelle
7
Es gibt einen Leistungsvorteil beim Minimieren Ihres Javascript.
Ryan Kinal
1
@ Ryan Kinal - wo genau in der Frage sehen Sie die Minimierung erwähnt?
Oded
2
@Oded - Die Minimierung entspricht den Leistungsbedenken. Wenn sich ein Stil für eine bessere Minimierung eignet, eignet er sich daher indirekt für Leistungsprobleme
STW
7
@ Ryan: Gute Minifizierer wie der Google Closure Compiler führen mehrere var-Anweisungen zu einer zusammen: img840.imageshack.us/img840/3601/closurecompilerservice.jpg
Daniel Vassallo
2
Ja, du hast recht. Aus Neugier habe ich einen Test erstellt ( jsperf.com/… ), ihn 5 Mal ausgeführt und 5 verschiedene Antworten erhalten. Also, ähm, ja, es geht nur um Stil und persönliche Vorlieben, nicht um Leistung.
Derek Henderson
28

Nachdem ich Crockford und andere gelesen hatte, begann ich, meine Variablen ausschließlich mit Komma zu verketten. Später ärgerte mich der Chrome DevTools-Debugger, der nicht bei Variablendefinitionen mit Komma stehen blieb. Für den Debugger sind mit Komma verkettete Variablendefinitionen eine einzelne Anweisung, während mehrere var-Anweisungen mehrere Anweisungen sind, bei denen der Debugger anhalten kann. Deshalb habe ich zurückgeschaltet von:

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

Zu:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

Inzwischen finde ich die zweite Variante viel sauberer, ganz zu schweigen von ihrem Vorteil, das Debugger-Problem zu lösen.

Das Argument "weniger Code durch den Draht" ist nicht überzeugend, da es Minifizierer gibt.

Felix
quelle
1
Ich habe das tatsächlich selbst erlebt. Normalerweise teile ich die Deklaration einfach dort auf, wo ich etwas überprüfen muss, und lege dort eine debuggerein, füge dann eine weitere hinzu varund verkette sie weiter mit Kommas. Wenn ich mit dem Debuggen fertig bin, gehe ich zurück und entferne das debuggerund das Extra var.
Collin Klopfenstein
7
Die zweite Variante macht die Git-Geschichte auch sauberer. Anstatt das nachfolgende Semikolon vor dem Hinzufügen einer weiteren Variablen in ein Komma ändern zu müssen oder eine globale Variable zu erstellen, fügen Sie einfach eine vollständige var-Anweisung hinzu.
Payne8
Um zu erwähnen, kann die erste Form fälschlicherweise dazu führen, dass Sie denken, b oder c sei global.
Garg10Mai
18

Ich bevorzuge die var-per-variableNotation:

var a = 2
var b = 3

weil die andere comma-instead-of-another-varNotation diese drei Mängel aufweist:

1. Schwer zu warten
Betrachten Sie diesen Code:

var a = 1,
    b = mogrify(2),
    c = 3

Aber hey, was macht der Mogrify? Drucken wir b aus, um herauszufinden:

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

bricht Sachen

2. Schwer zu lesen

Die Variable am Anfang der Zeile gibt deutlich an, dass eine neue Variable initiiert wird.

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

Was zum Teufel macht das c = 3da richtig?

3. Nicht konsistent

Bedenken Sie:

var a = 1,
    b = 2,
    c = 3

Folgen Sie bei var-per-variablejeder Deklaration der gleichen Struktur. Mit comma-instead-of-another-varder ersten Variablen wird anders deklariert als mit anderen. Wenn Sie beispielsweise die erste Variable innerhalb eines for-Zyklus verschieben möchten, müssen Sie var in die Mitte der Deklarationen einfügen

Abgesehen von der Präferenz scheint es, dass die meisten bemerkenswerten Projekte die var-per-variableNotation verwenden

Martin Gottweis
quelle
Ein Beispiel für diesen hässlichen Stil (Komma statt eines anderen Var), der seine Sache macht und die Leute verwirrt, finden Sie unter stackoverflow.com/questions/37332155/…
Scott Weaver
7

Ich stimme den anderen Antwortenden zu, dass dies hauptsächlich eine Frage des persönlichen Stils ist. Um eine "maßgebliche" Meinung in die Diskussion einzubringen, sagt Douglas Crockford auf der Website des beliebten JSLint-Tools Folgendes :

Da JavaScript jedoch keinen Blockbereich hat, ist es sinnvoller, alle Variablen einer Funktion oben in der Funktion zu deklarieren. Es wird empfohlen, pro Funktion eine einzige var-Anweisung zu verwenden. Dies kann mit der onevarOption erzwungen werden .

Daniel Vassallo
quelle
6
Es kann sich lohnen, unter Hinweis darauf , dass Mozilla Javascript (über das letKonstrukt) tut Block Umfang haben.
BlackVegetable
3
@BlackVegetable letkann in mehr als nur Mozilla JS verwendet werden ( siehe hier ). Es ist Teil der ES6-Spezifikation , aber die meisten Browser arbeiten noch an der Implementierung der Funktionen von ES6.
mbomb007
3

Wie andere angemerkt haben, ist es eine Stilpräferenz. JSLint weist Sie möglicherweise an, nur eine varpro Funktion zu haben (wenn Sie die "guten Teile" verwenden). Wenn Sie also JSLint verwenden, um Ihren Code zu überprüfen (keine schlechte Idee, IMHO), werden Sie am Ende das erste Format mehr als das letztere verwenden.

Auf der anderen Seite sagt derselbe Autor, Douglas Crockford , dass er jede Variable in seinen Codierungskonventionen in eine eigene Zeile setzen soll . Daher möchten Sie möglicherweise das Kontrollkästchen "Alle eine varpro Funktion" in JSLint deaktivieren, wenn Sie es verwenden. ;-);

Ketzeraffe
quelle
1
Er hat recht. Das Platzieren von Variablen in separaten Zeilen wird in den meisten Sprachen empfohlen, da Zusammenführungsalgorithmen für die Quellcodeverwaltung normalerweise jede Zeile als einfachen Text vergleichen (keine lexikalischen Anweisungen innerhalb einer Zeile). Wenn zwei Personen dieselbe Funktion bearbeiten, führt das Deklarieren mehrerer Variablen in derselben Zeile mit ziemlicher Sicherheit zu einem Zusammenführungskonflikt, während separate Zeilen fast immer automatisch zusammengeführt werden können. (Unabhängig davon, ob sie als separate varAnweisungen deklariert oder mit Kommas verkettet wurden.)
Richard Dingwall
2

Ich glaube nicht, dass es einen merklichen Unterschied gibt, für mich ist es nur eine persönliche Präferenz.

Ich hasse es, mehrere var-Deklarationen zu haben, also mache ich normalerweise:

var 
   one
  ,two
  ,three
  ,four
;

Da es kürzer und wohl besser lesbar ist, ist kein varRauschen zu sehen.

meder omuraliev
quelle
22
Schlüsselwort auf "wohl". Wenn ich dieses Beispiel in unserem finden würde, würde es var one, two, three four;sehr schnell werden. Hinzufügen von Linien-for-the-Sake-of-Linien in Javascript kann gefährlich sein (JS Dolmetscher ihre eigenen einfügen können ;--wenn Sie nicht erwarten , dass dies dann werden Sie schnell Nebenwirkungen finden. Auch führende ,‚s Bug me , Schlüsselwörter, die ihre eigene Leitung bekommen, nerven mich, die ;auf ihrer eigenen Leitung nervt mich. Werden Sie von der Leitung bezahlt?
STW
8
@STW - Sie lassen das automatische Einfügen von Semikolons wie eine zufällige Sache klingen, abhängig von den Launen der einzelnen Browser. In Wirklichkeit geschieht dies jedoch nur nach genau definierten Regeln, und Sie müssen sich keine Sorgen machen, dass dies passieren könnte die Mitte Ihrer varErklärung. (Obwohl ich Ihnen zustimme, dass führende Kommas varund das letzte Semikolon in ihren eigenen Zeilen stehen - alle drei
nerven
1
Ich denke nicht, dass dies die Frage wirklich beantwortet, da es nicht um persönliche Vorlieben geht.
Keith Pinson
2

Da ich keine Verweise darauf sehe, ist hier ein Link zur ECMA-262-Spezifikation, die die zugrunde liegende Spezifikation für JavaScript ist. Die Grammatik von dieser Seite sagt:

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

Was Sie daraus ableiten können, ist die Verwendung von Kommas oder spielt keine Rolle. In jedem Fall wird es als a analysiert VariableDeclarationund genauso behandelt. Es sollte keinen Unterschied geben, wie die Skript-Engine die beiden Deklarationen behandelt. Die einzigen Unterschiede wären diejenigen, die bereits in anderen Antworten erwähnt wurden - mehr Platz sparen und praktisch unermessliche Unterschiede in der Zeit, die zum Anwenden der Grammatik benötigt wird, um alle Informationen zu finden, VariableDeclarationswenn das Skript kompiliert wird.

Scott Mermelstein
quelle
1

Der erste spart ein paar Zeichen - daher gibt es eine sehr geringe Einsparung in Bezug auf die JS-Dateigröße und damit den Bandbreitenverbrauch. Dies würde sich nur in extremen Fällen bemerkbar machen.

STW
quelle
Dies setzt voraus, dass Sie Ihre Dateien nicht minimieren - und im Ernst, wer minimiert ihre Dateien heutzutage nicht?
Keith Pinson
1

Ich bevorzuge die zweite Version (jede hat ihre eigene var). Ich denke, das liegt daran, dass ich aus einem C ++ - Hintergrund komme. In C ++ können Sie Variablen wie in Ihrem ersten Beispiel deklarieren, aber es ist verpönt (es führt leicht zu Fehlern, wenn Sie versuchen, auf diese Weise Zeiger zu erstellen).

rmeador
quelle
1
Interessanter Punkt, aber ich bin nicht sicher, ob dies die Frage nach den tatsächlichen Vor- und Nachteilen dieser JavaScript- Syntax beantwortet .
Keith Pinson
1

Wenn Sie Ihr Javascript minimieren, gibt es einen ziemlich großen Vorteil:

var one, two, three, four;

wird

var a, b, c, d;

Wohingegen

var one;
var two;
var three;
var four;

wird

var a;
var b;
var c;
var d;

Das sind weitere drei Instanzen var, die sich im Laufe der Zeit summieren können.

Siehe die Artikelserie "A List Apart" "Better Javascript Minification", Teil 1 und Teil 2

Ryan Kinal
quelle
6
Gute Minifizierer wie der Google Closure Compiler führen mehrere var-Anweisungen zu einer zusammen: img840.imageshack.us/img840/3601/closurecompilerservice.jpg . Daher steht dieses Argument nur, wenn Sie einen weniger intelligenten Minifier verwenden ... was Sie nicht sollten :)
Daniel Vassallo
2
Und wenn Sie gzippen, erhöhen die wiederholten var s die Größe der gezippten Datei nicht nennenswert (wenn ich das Gzippen richtig verstehe).
Paul D. Waite