Por que aaa = 1,2,3
funciona e define o valor de aaa
para 1
?
Por que não var bbb = 1,2,3
funciona?
Por que var bbb = (1,2,3)
funciona e define o valor de bbb
para 3
?
Por que aaa = 1,2,3
funciona e define o valor de aaa
para 1
?
Por que não var bbb = 1,2,3
funciona?
Por que var bbb = (1,2,3)
funciona e define o valor de bbb
para 3
?
Respostas:
Há muita coisa acontecendo aqui, mas basicamente, tudo se resume ao operador vírgula .
O operador vírgula avalia seus dois operandos (da esquerda para a direita) e retorna o valor do segundo operando.
Este código:
aaa = 1,2,3
É equivalente a:
aaa = 1;
2;
3;
Portanto, aaa
é declarado implicitamente e atribuído um valor de 1. Observe que a saída no console é o resultado da última instrução, 3.
Este código:
var bbb = 1,2,3
É um erro de sintaxe porque as vírgulas em declarações de variáveis são usadas para declarar várias variáveis em uma única linha. Como o artigo MDN aponta,
Observe que a vírgula na
var
instrução não é o operador vírgula, porque ela não existe em uma expressão. Em vez disso, é um caractere especial nasvar
instruções combinar vários deles em um.
Portanto, este código é aproximadamente equivalente a:
var bbb = 1;
var 2;
var 3;
Claro, 2
não é um identificador válido, por isso falha nesse ponto.
Este código:
var bbb = (1,2,3)
É muito semelhante ao primeiro, exceto porque os valores numéricos estão entre parênteses, eles são avaliados primeiro. Portanto, isso é equivalente a:
1;
2;
var bbb = 3;
=
in var bbb = 1;
não é o mesmo que o =
in aaa = 1;
- eles vêm de diferentes produções (Initialiser vs AssignmentExpression) na gramática e simplesmente usam o mesmo token.
a = 1, 2, 3
pode ser colocado entre parênteses como o (a = 1), 2, 3
que avalia como a = 1; 2; 3
(e retorna 3, por exemplo b = (a = 1, 2, 3)
, atribuiria 3 a b). Em contraste, a = (1, 2, 3)
avalia como 1; 2; a = 3
e retorna 3.
(1 + 2) * 3
, o 1 + 2
é avaliado primeiro e o resultado dessa expressão é substituído de volta na expressão externa para o resto da avaliação.
A vírgula tem vários usos em Javascript. Na expressão:
a = 1, 2, 3;
é um operador que simplesmente retorna seu argumento do lado direito. Mas também faz parte da sintaxe das var
declarações, que são:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(onde [...]
significa que essa parte é opcional). Sua var
declaração não contém os nomes das variáveis após as vírgulas, portanto, ela não analisa. Você pode obter o efeito que deseja com:
var a = (1, 2, 3);
Os parênteses forçam as vírgulas a serem tratadas como operadores em vez de delimitadores entre as declarações de variáveis.
Em seus exemplos, a vírgula é usada em dois contextos:
var
declaraçãoA sintaxe da var
instrução é:
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
Aqui, a vírgula é usada para separar os pares nome-valor da variável. O seguinte não funcionará porque um nome de variável não pode começar com um dígito (veja os nomes dos identificadores ):
var bbb = 1, 2, 3;
// SyntaxError: Unexpected number
O operador vírgula avalia seus dois operandos (da esquerda para a direita) e retorna o valor do segundo operando. As seguintes expressões funcionam da seguinte maneira:
aaa = 1, 2, 3;
aaa = 1, 2
produz 2
aaa = 1
é avaliado primeiro porque =
tem uma prioridade maior do que,
2, 3
produz 3var bbb = (1, 2, 3);
(1, 2, 3)
produz 3
conforme descrito acimabbb
recebe o valor3
aaa = 1, 2, 3
=> O operador vírgula é usada para separar os 3 seguintes afirmações: aaa=1
, 2
e 3
. O resultado do operador vírgula é o valor da última instrução 3. No entanto, aaa recebe o valor 1, como pode ser visto claramente na captura de tela do OP. A razão para isso é a precedência do operador, com o operador vírgula tendo a precedência mais baixa.
No primeiro caso:
aaa = 1,2,3
as vírgulas servem como separadores de expressão. Ele executa uma atribuição para aaa
, em seguida, calcula 2
e descarta, então calcula 3
e descarta.
No segundo:
var bbb = 1,2,3
A var
palavra-chave diz ao compilador Javascript que a próxima coisa após a ,
deve ser outro nome de variável. Não está descobrindo, então morre e engasga.
var bbb = (1,2,3)
Aqui, o compilador primeiro avalia 1
e ignora. Em seguida, ele o avalia 2
e o ignora. Em seguida, ele avalia 3
e isso é deixado na pilha para que seja atribuído abbb
Embora usar vírgulas para separar expressões não seja comum, às vezes é útil em coisas como for
aparência.
for (i = 0, l = 10; i < l; i++) {
console.log(i);
}
var a1,a2,a3;
irá simplesmente declarar três variáveis locais.