¿Por qué aaa = 1,2,3
el trabajo y establece el valor de aaa
a 1
?
¿Por qué no var bbb = 1,2,3
funciona?
¿Por qué var bbb = (1,2,3)
el trabajo y establece el valor de bbb
a 3
?
¿Por qué aaa = 1,2,3
el trabajo y establece el valor de aaa
a 1
?
¿Por qué no var bbb = 1,2,3
funciona?
¿Por qué var bbb = (1,2,3)
el trabajo y establece el valor de bbb
a 3
?
Respuestas:
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 aaa
se 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
var
declaración no es el operador de coma, porque no existe dentro de una expresión. Más bien, es un carácter especial en lasvar
declaraciones combinar varios de ellos en uno.
Entonces este código es aproximadamente equivalente a:
var bbb = 1;
var 2;
var 3;
Por supuesto, 2
no 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;
=
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.
a = 1, 2, 3
puede poner entre paréntesis como (a = 1), 2, 3
que 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 = 3
y devuelve 3.
(1 + 2) * 3
, 1 + 2
se 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.
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 var
declaraciones, que son:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(donde [...]
significa que esa parte es opcional). A su var
declaració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.
En sus ejemplos, la coma se usa en dos contextos:
var
declaraciónLa sintaxis de la var
declaració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
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
aaa = 1
se evalúa primero porque =
tiene mayor prioridad que,
2, 3
rinde 3var bbb = (1, 2, 3);
(1, 2, 3)
rinde 3
como se describe arribabbb
se le asigna el valor3
aaa = 1, 2, 3
=> El operador de coma se utiliza para separar los 3 estados siguientes: aaa=1
, 2
y 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.
En el primer caso:
aaa = 1,2,3
las comas sirven como separadores de expresiones. Realiza una asignación aaa
, luego la calcula 2
y la descarta, luego la calcula 3
y la descarta.
En el segundo:
var bbb = 1,2,3
La var
palabra 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 1
y lo ignora. Luego lo evalúa 2
y lo ignora. Luego evalúa 3
y 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 for
aspecto.
for (i = 0, l = 10; i < l; i++) {
console.log(i);
}
var a1,a2,a3;
simplemente declarará tres variables locales.