Definição de variável JavaScript: vírgulas vs. ponto e vírgula

88

Quais são as diferenças e / ou vantagens, se houver, de usar vírgulas ao declarar um grupo de variáveis ​​em vez de ponto e vírgula.

Por exemplo:

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

versus

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

Eu sei que se você especificar a varpalavra-chave na primeira variável no primeiro exemplo, ela persiste em todas as variáveis, portanto, ambas produzem o mesmo resultado final em relação ao escopo. É apenas preferência pessoal ou há um benefício de desempenho em fazer isso de qualquer maneira?

Collin Klopfenstein
fonte

Respostas:

72

Nenhum benefício de desempenho, apenas uma questão de escolha pessoal e estilo.

A primeira versão é apenas mais sucinta.


Atualizar:

Em termos de quantidade de dados transmitidos, é claro que menos é melhor; no entanto, você precisaria de muitas vardeclarações removidas para ver um impacto real.

A minimização foi mencionada como algo que o primeiro exemplo ajudará para uma melhor minimização, no entanto, como Daniel Vassallo aponta nos comentários, um bom minificador fará isso automaticamente para você de qualquer maneira, portanto, a esse respeito, não haverá nenhum impacto.

Oded
fonte
8
Há um benefício de desempenho ao minimizar seu javascript.
Ryan Kinal
1
@Ryan Kinal - onde exatamente na pergunta você vê a minimização mencionada?
Oded
2
@Oded - a minimização está alinhada com as questões de desempenho. Portanto, se um estilo se presta a melhor minimização, então ele se presta indiretamente a questões de desempenho
STW
7
@Ryan: Bons minificadores, como o Google Closure Compiler mesclará várias instruções var em uma: img840.imageshack.us/img840/3601/closurecompilerservice.jpg
Daniel Vassallo
2
Sim você está certo. Por curiosidade, criei um teste ( jsperf.com/… ), executei 5 vezes e obtive 5 respostas diferentes. Então, um, sim, é tudo sobre estilo e preferência pessoal, não desempenho.
Derek Henderson de
28

Depois de ler Crockford e outros, comecei a encadear minhas variáveis ​​exclusivamente com vírgulas. Mais tarde, fiquei realmente irritado com o depurador Chrome DevTools, que não parava nas definições de variáveis ​​com vírgulas. Para o depurador, as definições de variáveis ​​encadeadas com vírgulas são uma única instrução, enquanto várias instruções var são várias instruções nas quais o depurador pode parar. Portanto, voltei de:

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

Para:

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

Até agora, acho a segunda variante muito mais limpa, sem mencionar sua vantagem de resolver o problema do depurador.

O argumento "menos código através do fio" não é convincente, pois existem minificadores.

Felix
fonte
1
Eu realmente experimentei isso sozinho. Normalmente, apenas divido a declaração onde preciso verificar algo e coloco um debuggerlá, depois adiciono outro vare continuo encadeando-os por vírgula. Então, quando termino a depuração, volto e removo o debuggere o extra var.
Collin Klopfenstein
7
A segunda variante também torna o histórico do git mais limpo. Em vez de alterar o ponto-e-vírgula final em uma vírgula antes de adicionar outra variável ou arriscar criar uma variável global, você simplesmente adiciona uma instrução var completa.
payne8 de
para mencionar, a primeira forma pode erroneamente fazer você pensar que b ou c é global.
garg10may
18

Eu prefiro a var-per-variablenotação:

var a = 2
var b = 3

porque a outra comma-instead-of-another-varnotação tem estas três deficiências:

1. Difícil de manter
Considere este código:

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

Mas ei, o que o mogrify faz? Vamos imprimir b para descobrir:

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

quebra coisas

2. Difícil de ler

A var no início da linha comunica claramente que haverá uma nova variável iniciada.

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

O que diabos está c = 3fazendo aí certo?

3. Não consistente

Considere isto:

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

A var-per-variablecada declaração segue a mesma estrutura. Com comma-instead-of-another-vara primeira variável é declarada de maneira diferente das outras. Se você decidir, digamos, mover a primeira variável dentro de um ciclo for, você terá que adicionar var no meio das declarações

Além da preferência, parece que a maioria dos projetos notáveis ​​usa a var-per-variablenotação

Martin Gottweis
fonte
para obter um exemplo desse estilo feio (vírgula em vez de outra var) fazendo isso e confundindo as pessoas, consulte stackoverflow.com/questions/37332155/…
Scott Weaver
7

Concordo com os outros respondentes que se trata principalmente de uma questão de estilo pessoal. Mas para trazer uma opinião "autorizada" para a discussão, isso é o que Douglas Crockford diz no site da popular ferramenta JSLint :

Mas, como o JavaScript não tem escopo de bloco, é mais inteligente declarar todas as variáveis ​​de uma função no topo da função. Recomenda-se que uma única instrução var seja usada por função. Isso pode ser aplicado com a onevaropção.

Daniel Vassallo
fonte
6
Pode ser interessante notar que Mozilla Javascript (através da letconstrução) faz tem escopo de bloco.
BlackVegetable
3
@BlackVegetable letpode ser usado em mais do que apenas Mozilla JS ( veja aqui ). Faz parte da especificação ES6 , mas a maioria dos navegadores ainda está trabalhando na implementação de recursos do ES6.
mbomb007
3

Como outros notaram, é uma preferência de estilo. O JSLint pode dizer para você ter apenas um varpor função (se você usar as "Partes boas"). Portanto, se estiver usando JSLint para verificar seu código (não é uma má idéia, IMHO), você acabará usando o primeiro formato mais do que o último.

Por outro lado, o mesmo autor, Douglas Crockford , diz para colocar cada variável em sua própria linha em suas convenções de codificação . Portanto, você pode querer desmarcar a varcaixa de seleção "Todos um por função" no JSLint se for usá-lo. ;-)

Macaco herege
fonte
1
Ele tem razão. Colocar variáveis ​​em linhas separadas é recomendado na maioria dos idiomas porque algoritmos de mesclagem de controle de origem normalmente funcionam comparando cada linha como texto simples (não instruções lexicais dentro de uma linha). Se duas pessoas editarem a mesma função, declarar várias variáveis ​​na mesma linha quase certamente causará um conflito de mesclagem, enquanto linhas separadas quase sempre podem ser mescladas automaticamente. (Independentemente de terem sido declarados como vardeclarações separadas ou encadeados com vírgulas.)
Richard Dingwall
2

Não acho que haja qualquer diferença perceptível, no que me diz respeito é apenas preferência pessoal.

Eu odeio ter várias declarações var, então geralmente faço:

var 
   one
  ,two
  ,three
  ,four
;

Como é mais curto e indiscutivelmente mais legível, nenhum varruído para olhar.

Meder Omuraliev
fonte
22
palavra-chave em "indiscutivelmente". Se eu encontrasse essa amostra na nossa, seria var one, two, three four;muito rápido. Adicionar linhas por causa das linhas em Javascript pode ser perigoso (os intérpretes JS podem inserir os seus próprios ;- se você não antecipar isso, você encontrará rapidamente os efeitos colaterais. Além disso, o líder ,me incomoda , palavras-chave obtendo sua própria linha me ;incomodam, a própria linha me incomoda. Você é pago por linha?
STW
8
@STW - Você faz a inserção automática de ponto-e-vírgula parecer algo aleatório, sujeito aos caprichos de navegadores individuais, mas na realidade isso só ocorre de acordo com um conjunto de regras bem definidas e você não precisa se preocupar se isso pode acontecer em no meio da sua vardeclaração. (Embora eu concorde com você sobre as vírgulas iniciais e sobre varo ponto-e-vírgula final estar em suas próprias linhas - todos os três me incomodam também.)
nnnnnn
1
Não acho que isso realmente responda à pergunta, uma vez que a pergunta não é sobre preferência pessoal.
Keith Pinson de
2

Como não vejo nenhuma referência a ele, aqui está um link para a especificação ECMA-262, que é a especificação subjacente para JavaScript. A gramática dessa página diz:

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

O que você pode deduzir disso é usar vírgulas ou não, não importa. De qualquer forma, ele acaba sendo analisado como um VariableDeclaratione é tratado exatamente da mesma forma. Não deve haver diferença em como o mecanismo de script trata as duas declarações. As únicas diferenças seriam aquelas já mencionadas em outras respostas - economizando mais espaço e diferenças praticamente imensuráveis ​​na quantidade de tempo que leva para aplicar a gramática para encontrar todos os VariableDeclarationsquando o script é compilado.

Scott Mermelstein
fonte
1

O primeiro salva alguns caracteres - portanto, há uma economia muito pequena em termos do tamanho do arquivo JS e, portanto, do consumo de largura de banda. A única vez que isso se tornaria perceptível seria em casos extremos.

STW
fonte
Isso pressupõe que você não está minimizando seus arquivos --- e sério, quem não reduz seus arquivos atualmente?
Keith Pinson de
1

Eu prefiro a segunda versão (cada uma tem a sua var). Acho que é porque venho de uma formação C ++. Em C ++, você pode declarar variáveis ​​como no primeiro exemplo, mas é desaprovado (facilmente leva a erros quando você tenta criar ponteiros dessa forma).

rmeador
fonte
1
Ponto interessante, mas não tenho certeza se isso responde à pergunta sobre quais são as vantagens e desvantagens reais dessa sintaxe JavaScript .
Keith Pinson de
1

Se você estiver minimizando seu javascript, há uma grande vantagem:

var one, two, three, four;

torna-se

var a, b, c, d;

Enquanto que

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

torna-se

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

São três instâncias adicionais de var, que podem aumentar com o tempo.

Consulte a série de artigos "A List Apart" "Better Javascript Minification" Parte 1 e Parte 2

Ryan Kinal
fonte
6
Bons minificadores, como o Google Closure Compiler, mesclam várias instruções var em uma: img840.imageshack.us/img840/3601/closurecompilerservice.jpg . Portanto, este argumento vale apenas se você estiver usando um minificador menos inteligente ... o que você não deveria :)
Daniel Vassallo
2
E se você estiver var compactando o gzip , os repetidos s não aumentarão significativamente o tamanho do arquivo compactado (se eu entendi o gzipamento corretamente).
Paul D. Waite