Definición de variable de JavaScript: comas frente a punto y coma

88

¿Cuáles son las diferencias y / o ventajas, si las hay, de usar comas al declarar un grupo de variables en lugar de punto y coma?

Por ejemplo:

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

versus

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

Sé que si especifica la varpalabra clave en la primera variable en el primer ejemplo, persiste en todas las variables, por lo que ambas producen el mismo resultado final con respecto al alcance. ¿Es solo una preferencia personal, o hay un beneficio de rendimiento al hacerlo de cualquier manera?

Collin Klopfenstein
fuente

Respuestas:

72

Sin beneficio de rendimiento, solo una cuestión de elección personal y estilo.

La primera versión es más concisa.


Actualizar:

En términos de la cantidad de datos que se transmiten por cable, por supuesto, menos es mejor, sin embargo, necesitaría un montón de vardeclaraciones eliminadas para ver un impacto real.

La minificación se ha mencionado como algo con lo que el primer ejemplo ayudará para una mejor minificación, sin embargo, como señala Daniel Vassallo en los comentarios, un buen minificador lo hará automáticamente por ti de todos modos, por lo que en ese sentido no tiene ningún impacto.

Oded
fuente
8
Hay un beneficio de rendimiento al minificar su javascript.
Ryan Kinal
1
@Ryan Kinal: ¿en qué parte de la pregunta ve exactamente que se menciona la minificación?
Oded el
2
@Oded: la minificación está en línea con las preocupaciones de rendimiento. Por lo tanto, si un estilo se presta a una mejor minificación, entonces se presta indirectamente a problemas de rendimiento
STW
7
@Ryan: Buenos minificadores, como el compilador de cierre de Google fusionará varias declaraciones var en una sola: img840.imageshack.us/img840/3601/closurecompilerservice.jpg
Daniel Vassallo
2
Sí, tiene usted razón. Por curiosidad, creé una prueba ( jsperf.com/… ), la ejecuté 5 veces y obtuve 5 respuestas diferentes. Entonces, eh, sí, se trata de estilo y preferencia personal, no de rendimiento.
Derek Henderson
29

Después de leer Crockford y otros, comencé a encadenar mis variables exclusivamente con comas. Luego, más tarde, realmente me molestó el depurador de Chrome DevTools que no se detenía en las definiciones de variables con comas. Para el depurador, las definiciones de variables encadenadas con comas son una sola declaración, mientras que varias declaraciones var son declaraciones múltiples en las que el depurador puede detenerse. Por lo tanto, cambié de:

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

A:

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

Por ahora, encuentro la segunda variante mucho más limpia, sin mencionar su ventaja de resolver el problema del depurador.

El argumento de "menos código a través del cable" no es persuasivo, ya que existen minificadores.

Felix
fuente
1
De hecho, yo mismo he experimentado esto. Por lo general, solo divido la declaración donde necesito verificar algo, y coloco una debuggerallí, luego agrego otra vary sigo encadenando por comas. Luego, cuando termino de depurar, regreso y elimino el debuggery extra var.
Collin Klopfenstein
7
La segunda variante también hace que el historial de git sea más limpio. En lugar de tener que cambiar el punto y coma al final por una coma antes de agregar otra variable o arriesgarse a crear una variable global, simplemente agregue una instrucción var completa.
payne8
por mencionar, la primera forma puede hacerle pensar erróneamente que b o c es global.
garg10may
18

Prefiero la var-per-variablenotación:

var a = 2
var b = 3

porque la otra comma-instead-of-another-varnotación tiene estas tres deficiencias:

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

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

Pero bueno, ¿qué hace el mogrify? Imprimamos b para averiguarlo:

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

rompe cosas

2. Difícil de leer

La var al principio de la línea comunica claramente que habrá una nueva variable iniciada.

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

¿Qué diablos está c = 3haciendo ahí bien?

3. No consistente

Considera esto:

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

Con var-per-variablecada declaración sigue la misma estructura. Concomma-instead-of-another-var la primera variable se declara de forma diferente a las demás. Si decide, digamos, mover la primera variable dentro de un ciclo for, tendrá que agregar var al medio de las declaraciones

Aparte de la preferencia, parece que la mayoría de los proyectos notables utilizan la var-per-variablenotación

Martin Gottweis
fuente
para ver un ejemplo de este estilo feo (coma-en-lugar-de-otra-var) haciendo lo suyo y confundiendo a la gente, consulte stackoverflow.com/questions/37332155/…
Scott Weaver
7

Estoy de acuerdo con los demás que respondieron en que se trata principalmente de una cuestión de estilo personal. Pero para traer una opinión "autorizada" a la discusión, esto es lo que dice Douglas Crockford en el sitio web de la popular herramienta JSLint :

Pero debido a que JavaScript no tiene alcance de bloque, es más prudente declarar todas las variables de una función en la parte superior de la función. Se recomienda que se utilice una sola instrucción var por función. Esto se puede hacer cumplir con la onevaropción.

Daniel Vassallo
fuente
6
Puede ser digno de mención que Mozilla Javascript (a través de la letconstrucción) hace tener ámbito de bloque.
BlackVegetable
3
@BlackVegetable letse puede usar en algo más que Mozilla JS ( ver aquí ). Es parte de la especificación ES6 , pero la mayoría de los navegadores todavía están trabajando en la implementación de funciones de ES6.
mbomb007
3

Como han señalado otros, es una preferencia de estilo. JSLint podría decirle que solo tenga unovar por función (si usa las "Partes buenas"). Por lo tanto, si usa JSLint para verificar su código (no es una mala idea, en mi humilde opinión), terminará usando el primer formato más que el segundo.

Por otro lado, el mismo autor, Douglas Crockford , dice poner cada variable en su propia línea en sus convenciones de codificación . Por lo tanto, es posible que desee desmarcar la varcasilla de verificación "Todos uno por función" en JSLint si la usa. ;-)

Mono hereje
fuente
1
El tiene razón. En la mayoría de los lenguajes se recomienda colocar las variables en líneas separadas porque los algoritmos de fusión de control de código fuente normalmente funcionan comparando cada línea como texto sin formato (no declaraciones léxicas dentro de una línea). Si dos personas editan la misma función, la declaración de varias variables en la misma línea provocará casi con certeza un conflicto de fusión, mientras que las líneas separadas casi siempre se pueden fusionar automáticamente. (Independientemente de si se declararon como vardeclaraciones separadas o encadenadas con comas).
Richard Dingwall
2

No creo que haya ninguna diferencia notable, en lo que a mí respecta, es solo una preferencia personal.

Odio tener varias declaraciones de var, así que normalmente lo hago:

var 
   one
  ,two
  ,three
  ,four
;

Como es más corto y posiblemente más legible, no hay varruido para mirar.

meder omuraliev
fuente
22
palabra clave en "posiblemente". Si encontrara esta muestra en la nuestra, sería var one, two, three four;muy rápido. Agregar líneas por el bien de las líneas en Javascript puede ser peligroso (los intérpretes de JS pueden insertar las suyas propias ;; si no lo anticipa, encontrará rápidamente efectos secundarios. Además, el líder ,me molesta , las palabras clave que tienen su propia línea me molestan, las palabras clave en su propia línea me ;molestan. ¿Le pagan por línea?
STW
8
@STW: hace que la inserción automática de punto y coma suene como algo aleatorio, sujeto a los caprichos de los navegadores individuales, pero en realidad solo ocurre de acuerdo con un conjunto de reglas bien definidas y no tiene que preocuparse de que pueda suceder en la mitad de su vardeclaración. (Aunque estoy de acuerdo con usted sobre las comas iniciales, y sobre vary el punto y coma final en sus propias líneas, los tres también me
molestan
1
No creo que esto realmente responda a la pregunta, ya que no se trata de preferencias personales.
Keith Pinson
2

Como no veo ninguna referencia a él, aquí hay un enlace a la especificación ECMA-262, que es la especificación subyacente de JavaScript. La gramática de esa página 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

Lo que puedes deducir de esto es usar comas o no, no importa. De cualquier manera, termina siendo analizado como un VariableDeclarationy se trata exactamente igual. No debería haber ninguna diferencia en cómo el motor de secuencia de comandos trata las dos declaraciones. Las únicas diferencias serían las que ya se mencionaron en otras respuestas: ahorrar más espacio y diferencias prácticamente inconmensurables en la cantidad de tiempo que se necesita para aplicar la gramática para encontrar todas las VariableDeclarationscuando se compila el script.

Scott Mermelstein
fuente
1

El primero guarda algunos caracteres, por lo que hay un ahorro muy pequeño en términos de JS y, por lo tanto, de consumo de ancho de banda. La única vez que esto se haría notorio sería en casos extremos.

STW
fuente
Esto supone que no está minimizando sus archivos y, en serio, ¿quién no minimiza sus archivos en estos días?
Keith Pinson
1

Prefiero la segunda versión (cada una tiene la suya var). Creo que es porque vengo de C ++. En C ++, puede declarar variables como lo hace en su primer ejemplo, pero está mal visto (conduce fácilmente a errores cuando intenta crear punteros de esa manera).

rmeador
fuente
1
Un punto interesante, pero no estoy seguro de que esto responda a la pregunta de cuáles son las ventajas y desventajas reales de esta sintaxis de JavaScript .
Keith Pinson
1

Si está minimizando su javascript, existe un beneficio bastante grande:

var one, two, three, four;

se convierte en

var a, b, c, d;

Donde como

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

se convierte en

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

Son tres instancias adicionales de var, que pueden acumularse con el tiempo.

Consulte la serie de artículos "Una lista aparte" "Mejor minificación de JavaScript" Parte 1 y Parte 2

Ryan Kinal
fuente
6
Los buenos minificadores, como Google Closure Compiler, fusionarán varias declaraciones var en una sola: img840.imageshack.us/img840/3601/closurecompilerservice.jpg . Por lo tanto, este argumento es válido solo si está usando un minificador menos inteligente ... lo cual no debería :)
Daniel Vassallo
2
Y si usa gzip, las var s repetidas no aumentarán apreciablemente el tamaño del archivo comprimido con gzip (si entiendo correctamente el gzip).
Paul D. Waite