¿Funciona la asignación con coma?

108

¿Por qué aaa = 1,2,3el trabajo y establece el valor de aaaa 1?

¿Por qué no var bbb = 1,2,3funciona?

¿Por qué var bbb = (1,2,3)el trabajo y establece el valor de bbba 3?

Sesión de consola de ejemplo

Shankar Cabus
fuente
9
Obtiene el error de sintaxis porque los nombres de las variables no pueden comenzar con un número. var a1,a2,a3;simplemente declarará tres variables locales.
Jared Farrish

Respuestas:

200

Están sucediendo muchas cosas aquí, pero básicamente todo se reduce al operador de coma .

El operador de coma evalúa ambos operandos (de izquierda a derecha) y devuelve el valor del segundo operando.


Este código:

aaa = 1,2,3

Es equivalente a:

aaa = 1;
2;
3;

Entonces aaase declara implícitamente y se le asigna un valor de 1. Observe que la salida en la consola es el resultado de la última declaración, 3.


Este código:

var bbb = 1,2,3

Es un error de sintaxis porque las comas en las declaraciones de variables se utilizan para declarar múltiples variables en una sola línea. Como señala el artículo de MDN,

Tenga en cuenta que la coma en la vardeclaración no es el operador de coma, porque no existe dentro de una expresión. Más bien, es un carácter especial en las vardeclaraciones combinar varios de ellos en uno.

Entonces este código es aproximadamente equivalente a:

var bbb = 1;
var 2;
var 3;

Por supuesto, 2no es un identificador válido, por lo que falla en ese punto.


Este código:

var bbb = (1,2,3)

Es muy similar al primero, excepto porque los valores numéricos están entre paréntesis, se evalúan primero. Entonces esto es aproximadamente equivalente a:

1;
2;
var bbb = 3;
pswg
fuente
17
Aún más, el =in var bbb = 1;no es el mismo que el =in aaa = 1;: provienen de diferentes producciones (Initialiser vs AssignmentExpression) en la gramática y simplemente usan el mismo token.
Ryan Cavanaugh
7
Muy bonita explicación. Lo que no fue del todo explícito fue que se a = 1, 2, 3puede poner entre paréntesis como (a = 1), 2, 3que se evalúa como a = 1; 2; 3(y devuelve 3, por ejemplo b = (a = 1, 2, 3), asignaría 3 a b). Por el contrario, se a = (1, 2, 3)evalúa como 1; 2; a = 3y devuelve 3.
CompuChip
¿Qué dice el MDN sobre los parens en la asignación de variables y por qué está al revés? No pude encontrar el documento
Brian
@staticx En realidad, nada se hace "al revés". Los paréntesis se evalúan primero. Al igual que cuando lo hizo (1 + 2) * 3, 1 + 2se evalúa primero y el resultado de esa expresión se sustituye de nuevo en la expresión externa para el resto de la evaluación.
pswg
9

La coma tiene múltiples usos en Javascript. En la expresión:

a = 1, 2, 3;

es un operador que simplemente devuelve su argumento de la derecha. Pero también es parte de la sintaxis de las vardeclaraciones, que son:

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

(donde [...]significa que esa parte es opcional). A su vardeclaración le faltan los nombres de las variables después de las comas, por lo que no analiza. Puede obtener el efecto que desea con:

var a = (1, 2, 3);

Los paréntesis obligan a que las comas se traten como operadores en lugar de como delimitadores entre declaraciones de variables.

Barmar
fuente
7

En sus ejemplos, la coma se usa en dos contextos:

var declaración

La sintaxis de la vardeclaración es:

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

Aquí, la coma se usa para separar pares de nombre-valor de variable. Lo siguiente no funcionará porque un nombre de variable no puede comenzar con un dígito (ver nombres de identificadores ):

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

Operador de coma

El operador de coma evalúa ambos operandos (de izquierda a derecha) y devuelve el valor del segundo operando. Las siguientes expresiones funcionan de la siguiente manera:

aaa = 1, 2, 3;
  • aaa = 1, 2 rinde 2
    • tenga en cuenta que aaa = 1se evalúa primero porque =tiene mayor prioridad que,
  • 2, 3 rinde 3
var bbb = (1, 2, 3);
  • la expresión (1, 2, 3)rinde 3como se describe arriba
  • A la variable bbbse le asigna el valor3
Salman A
fuente
2
aaa = 1, 2, 3=> El operador de coma se utiliza para separar los 3 estados siguientes: aaa=1, 2y 3. El resultado del operador de coma es el valor de la última declaración 3. Sin embargo, aaa se le asigna el valor de 1, como se puede ver claramente en la captura de pantalla del OP. La razón de esto es la precedencia del operador, y el operador coma tiene la precedencia más baja.
Tibos
1

En el primer caso:

aaa = 1,2,3

las comas sirven como separadores de expresiones. Realiza una asignación aaa, luego la calcula 2y la descarta, luego la calcula 3y la descarta.

En el segundo:

var bbb = 1,2,3

La varpalabra clave le dice al compilador de Javascript que lo siguiente después de ,debe ser otro nombre de variable. No está encontrando, por lo que muere y se atraganta.

var bbb = (1,2,3)

Aquí, el compilador primero lo evalúa 1y lo ignora. Luego lo evalúa 2y lo ignora. Luego evalúa 3y eso se deja en la pila para que se asigne abbb

Si bien el uso de comas para separar expresiones no es común, a veces es útil en aspectos como el foraspecto.

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