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
?
javascript
syntax
Shankar Cabus
fonte
fonte
var a1,a2,a3;
irá simplesmente declarar três variáveis locais.Respostas:
Há muita coisa acontecendo aqui, mas basicamente, tudo se resume ao operador vírgula .
Este código:
É equivalente a:
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:
É 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,
Portanto, este código é aproximadamente equivalente a:
Claro,
2
não é um identificador válido, por isso falha nesse ponto.Este código:
É muito semelhante ao primeiro, exceto porque os valores numéricos estão entre parênteses, eles são avaliados primeiro. Portanto, isso é equivalente a:
fonte
=
invar bbb = 1;
não é o mesmo que o=
inaaa = 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 comoa = 1; 2; 3
(e retorna 3, por exemplob = (a = 1, 2, 3)
, atribuiria 3 a b). Em contraste,a = (1, 2, 3)
avalia como1; 2; a = 3
e retorna 3.(1 + 2) * 3
, o1 + 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:
é um operador que simplesmente retorna seu argumento do lado direito. Mas também faz parte da sintaxe das
var
declarações, que são:(onde
[...]
significa que essa parte é opcional). Suavar
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:Os parênteses forçam as vírgulas a serem tratadas como operadores em vez de delimitadores entre as declarações de variáveis.
fonte
Em seus exemplos, a vírgula é usada em dois contextos:
var
declaraçãoA sintaxe da
var
instrução é: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 ):
Operador de vírgula
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
produz 2aaa = 1
é avaliado primeiro porque=
tem uma prioridade maior do que,
2, 3
produz 3(1, 2, 3)
produz3
conforme descrito acimabbb
recebe o valor3
fonte
aaa = 1, 2, 3
=> O operador vírgula é usada para separar os 3 seguintes afirmações:aaa=1
,2
e3
. 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, calcula2
e descarta, então calcula3
e descarta.No segundo:
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.Aqui, o compilador primeiro avalia
1
e ignora. Em seguida, ele o avalia2
e o ignora. Em seguida, ele avalia3
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.fonte