Definizione di variabile JavaScript: virgole e punti e virgola


88

Quali sono le differenze e / o i vantaggi, se ce ne sono, dell'uso delle virgole quando si dichiara un gruppo di variabili piuttosto che il punto e virgola.

Per esempio:

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

contro

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

So che se specifichi la varparola chiave sulla prima variabile nel primo esempio, persiste su tutte le variabili, quindi entrambe producono lo stesso risultato finale per quanto riguarda l'ambito. È solo una preferenza personale o c'è un vantaggio in termini di prestazioni nel farlo in entrambi i casi?

Risposte:


72

Nessun vantaggio in termini di prestazioni, solo una questione di scelta personale e stile.

La prima versione è solo più succinta.


Aggiornare:

In termini di quantità di dati in transito, ovviamente meno è meglio, tuttavia avresti bisogno di molte vardichiarazioni rimosse per vedere un impatto reale.

La minificazione è stata menzionata come qualcosa che il primo esempio aiuterà per una migliore minificazione, tuttavia, come sottolinea Daniel Vassallo nei commenti, un buon minificatore lo farà automaticamente comunque per te, quindi sotto questo aspetto nessun impatto di sorta.


8
C'è un vantaggio in termini di prestazioni quando si minimizza il proprio javascript.
Ryan Kinal,

1
@ Ryan Kinal - dove esattamente nella domanda vedi menzionata la minificazione?
Oded

2
@Oded: la minificazione è in linea con i problemi di prestazioni. Pertanto, se uno stile si presta a una migliore minificazione, si presta indirettamente a problemi di prestazioni
STW

7
@ Ryan: I buoni minifiers, come il compilatore di chiusura di Google uniranno più istruzioni var in una: img840.imageshack.us/img840/3601/closurecompilerservice.jpg
Daniel Vassallo

2
Si hai ragione. Per curiosità, ho creato un test ( jsperf.com/… ), l'ho eseguito 5 volte e ho ottenuto 5 risposte diverse. Quindi, um, sì, è tutta una questione di stile e preferenze personali, non di prestazioni.
Derek Henderson

29

Dopo aver letto Crockford e altri, ho iniziato a concatenare le mie variabili esclusivamente con virgola. Successivamente, sono stato davvero infastidito dal debugger di Chrome DevTools che non si fermava alle definizioni delle variabili con una virgola. Per il debugger, le definizioni di variabili concatenate con virgola sono una singola istruzione, mentre più istruzioni var sono più istruzioni alle quali il debugger può fermarsi. Pertanto, sono tornato da:

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

Per:

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

A questo punto, trovo la seconda variante molto più pulita, per non parlare del suo vantaggio di risolvere il problema del debugger.

L'argomento "meno codice attraverso il filo" non è persuasivo, in quanto esistono minificatori.


1
L'ho effettivamente sperimentato io stesso. In genere divido la dichiarazione in cui devo controllare qualcosa e inserisco una debugger, quindi ne aggiungo un'altra vare continuo a concatenarli con virgole. Quindi, quando ho finito il debug, torno indietro e rimuovo debuggere extra var.
Collin Klopfenstein

7
La seconda variante rende anche più pulita la cronologia di git. Invece di dover cambiare il punto e virgola finale in una virgola prima di aggiungere un'altra variabile o rischiare di creare una variabile globale, aggiungi semplicemente un'istruzione var completa.
payne8

per menzionare, la prima forma può erroneamente farti pensare b o c è globale.
garg10 maggio

18

Preferisco la var-per-variablenotazione:

var a = 2
var b = 3

perché l'altra comma-instead-of-another-varnotazione ha questi tre difetti:

1. Difficile da mantenere
Considera questo codice:

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

Ma hey, cosa fa il Mogrify? Stampiamo b per scoprirlo:

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

rompe cose

2. Difficile da leggere

Il var nell'accattonaggio della riga comunica chiaramente che verrà avviata una nuova variabile.

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

Che diavolo c = 3ci fa lì, giusto?

3. Non coerente

Considera questo:

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

Ad var-per-variableogni dichiarazione seguire la stessa struttura. Con comma-instead-of-another-varla prima variabile viene dichiarata in modo diverso dalle altre. Se decidi, ad esempio, di spostare la prima variabile all'interno di un ciclo for, dovrai aggiungere var al centro delle dichiarazioni

A parte la preferenza, sembra che la maggior parte dei progetti importanti utilizzi la var-per-variablenotazione


per un esempio di questo brutto stile (virgola-invece-di-un'altra-var) che fa la sua cosa e confonde le persone, vedi stackoverflow.com/questions/37332155/…
Scott Weaver

7

Concordo con gli altri rispondenti che si tratta principalmente di una questione di stile personale. Ma per portare un'opinione "autorevole" nella discussione, questo è ciò che dice Douglas Crockford sul sito web del popolare strumento JSLint :

Ma poiché JavaScript non ha un ambito di blocco, è più saggio dichiarare tutte le variabili di una funzione all'inizio della funzione. Si consiglia di utilizzare una singola istruzione var per funzione. Questo può essere applicato con l' onevaropzione.


6
Può essere interessante notare che Mozilla JavaScript (tramite il letcostrutto) ha avere la possibilità di blocco.
BlackVegetable

3
@BlackVegetable letpuò essere utilizzato in più di Mozilla JS ( vedi qui ). Fa parte della specifica ES6 , ma la maggior parte dei browser sta ancora lavorando all'implementazione delle funzionalità di ES6.
mbomb007

3

Come altri hanno notato, è una preferenza di stile. JSLint potrebbe dirti di averne solo uno varper funzione (se usi le "Parti buone"). Quindi, se usi JSLint per controllare il tuo codice (non è una cattiva idea, IMHO), finirai per utilizzare il primo formato più del secondo.

D'altra parte, lo stesso autore, Douglas Crockford , dice di mettere ogni variabile nella propria riga nelle sue convenzioni di codifica . Quindi potresti voler deselezionare la casella di controllo "Tutti varper funzione" in JSLint se lo usi. ;-)


1
Ha ragione. L'inserimento di variabili su righe separate è consigliato nella maggior parte delle lingue perché gli algoritmi di unione del controllo del codice sorgente funzionano in genere confrontando ogni riga come testo normale (non istruzioni lessicali all'interno di una riga). Se due persone modificano la stessa funzione, la dichiarazione di più variabili sulla stessa riga causerà quasi certamente un conflitto di unione, mentre righe separate possono quasi sempre essere unite automaticamente. (Indipendentemente dal fatto che siano state dichiarate come dichiarazioni separate varo incatenate con virgole).
Richard Dingwall

2

Non credo ci siano differenze evidenti, per quanto mi riguarda è solo una preferenza personale.

Odio avere più dichiarazioni var, quindi di solito lo faccio:

var 
   one
  ,two
  ,three
  ,four
;

Poiché è più breve e probabilmente più leggibile, nessun varrumore da guardare.


22
parola chiave su "discutibilmente". Se trovassi questo campione nel nostro lo diventerebbe var one, two, three four;molto rapidamente. L'aggiunta di righe per amore di righe in Javascript può essere pericolosa (gli interpreti JS possono inserirne di proprie ;- se non lo prevedi, troverai rapidamente effetti collaterali. Inoltre, ,il bug principale di me , le parole chiave che ottengono la propria riga mi danno il bug, la ;sola linea mi infastidisce. Sei pagato in linea?
STW

8
@STW - Fai sembrare l'inserimento automatico del punto e virgola come una cosa casuale, soggetta ai capricci dei singoli browser, ma in realtà avviene solo secondo un insieme ben definito di regole e non devi preoccuparti che possa accadere in nel mezzo della tua vardichiarazione. (Anche se sono d'accordo con te sul fatto che le virgole iniziali, e circa vare il punto e virgola finale siano sulle loro righe - tutti e tre bug anche per me.)
nnnnnn

1
Non credo che questo risponda davvero alla domanda, dal momento che la domanda non riguarda le preferenze personali.
Keith Pinson

2

Dal momento che non vedo alcun riferimento ad esso, ecco un collegamento alla specifica ECMA-262, che è la specifica sottostante per JavaScript. La grammatica di quella pagina dice:

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

Quello che puoi ricavare da questo è usare virgole o meno, non importa. Ad ogni modo, finisce per essere analizzato come a VariableDeclaratione viene trattato esattamente allo stesso modo. Non dovrebbe esserci alcuna differenza nel modo in cui il motore di script tratta le due dichiarazioni. Le uniche differenze sarebbero quelle già menzionate in altre risposte - risparmiando più spazio e differenze praticamente incommensurabili nella quantità di tempo necessaria per applicare la grammatica per trovare tutto VariableDeclarationsquando lo script viene compilato.


1

Il primo salva alcuni caratteri, quindi c'è un risparmio molto piccolo in termini di dimensione del file JS e quindi consumo di larghezza di banda. L'unica volta che questo sarebbe diventato evidente sarebbe in casi estremi.


Questo presume che tu non stia minimizzando i tuoi file --- e seriamente, chi non minimizza i loro file in questi giorni?
Keith Pinson

1

Preferisco la seconda versione (ognuna ha la sua var). Penso che sia perché vengo da uno sfondo C ++. In C ++, puoi dichiarare variabili come fai nel tuo primo esempio, ma è disapprovato (porta facilmente a errori quando stai cercando di creare puntatori in questo modo).


1
Punto interessante, ma non sono sicuro che questo risponda alla domanda su quali sono i vantaggi e gli svantaggi effettivi di questa sintassi JavaScript .
Keith Pinson

1

Se stai minimizzando il tuo javascript, c'è un vantaggio abbastanza grande:

var one, two, three, four;

diventa

var a, b, c, d;

Mentre

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

diventa

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

Sono altre tre istanze di var, che possono sommarsi nel tempo.

Vedere la serie di articoli "A List Apart" "Better Javascript Minification" Parte 1 e Parte 2


6
I buoni minifiers, come il compilatore di chiusura di Google, uniranno più istruzioni var in una: img840.imageshack.us/img840/3601/closurecompilerservice.jpg . Quindi questo argomento è valido solo se stai usando un minifier meno intelligente ... cosa che non dovresti :)
Daniel Vassallo

2
E se stai eseguendo la compressione con gzip, le var s ripetute non aumenteranno in modo apprezzabile la dimensione del file compresso con gzip (se comprendo correttamente la compressione con gzip).
Paul D. Waite,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.