Pourquoi aaa = 1,2,3
fonctionne et définit la valeur de aaa
à 1
?
Pourquoi ça ne var bbb = 1,2,3
marche pas ?
Pourquoi var bbb = (1,2,3)
fonctionne et définit la valeur de bbb
à 3
?
javascript
syntax
Shankar Cabus
la source
la source
var a1,a2,a3;
déclarera simplement trois variables locales.Réponses:
Il se passe beaucoup de choses ici, mais fondamentalement, cela revient à l' opérateur virgule .
Ce code:
Est équivalent à:
So
aaa
est implicitement déclaré et attribué une valeur de 1. Notez que la sortie sur la console est le résultat de la dernière instruction, 3.Ce code:
Est une erreur de syntaxe car les virgules dans les déclarations de variables sont utilisées pour déclarer plusieurs variables sur une seule ligne. Comme le souligne l'article MDN,
Donc, ce code équivaut à peu près à:
Bien sûr, ce
2
n'est pas un identifiant valide, donc il échoue à ce stade.Ce code:
Est très similaire au premier, sauf parce que les valeurs numériques sont placées entre parenthèses, elles sont évaluées en premier. C'est donc à peu près équivalent à:
la source
=
invar bbb = 1;
n'est pas le même=
que le inaaa = 1;
- ils proviennent de différentes productions (Initialiser vs AssignmentExpression) dans la grammaire et utilisent simplement le même jeton.a = 1, 2, 3
peut être mis entre parenthèses comme(a = 1), 2, 3
qui évalue commea = 1; 2; 3
(et renvoie 3, par exempleb = (a = 1, 2, 3)
attribuerait 3 à b). En revanche,a = (1, 2, 3)
évalue1; 2; a = 3
et renvoie 3.(1 + 2) * 3
, le1 + 2
est évalué en premier et le résultat de cette expression est replacé dans l'expression externe pour le reste de l'évaluation.La virgule a de multiples utilisations en Javascript. Dans l'expression:
c'est un opérateur qui renvoie simplement son argument de droite. Mais cela fait également partie de la syntaxe des
var
déclarations, qui sont:(où
[...]
signifie que cette partie est facultative). Votrevar
déclaration ne contient pas les noms de variables après les virgules, elle n'est donc pas analysée. Vous pouvez obtenir l'effet souhaité avec:Les parenthèses forcent les virgules à être traitées comme des opérateurs plutôt que comme des délimiteurs entre les déclarations de variables.
la source
Dans vos exemples, la virgule est utilisée dans deux contextes:
var
déclarationLa syntaxe de l'
var
instruction est:Ici, la virgule est utilisée pour séparer les paires nom-valeur de variable. Ce qui suit ne fonctionnera pas car un nom de variable ne peut pas commencer par un chiffre (voir les noms d'identifiant ):
Opérateur virgule
L'opérateur virgule évalue ses deux opérandes (de gauche à droite) et renvoie la valeur du deuxième opérande. Les expressions suivantes fonctionnent comme suit:
aaa = 1, 2
donne 2aaa = 1
est évalué en premier car il=
a une priorité plus élevée que,
2, 3
donne 3(1, 2, 3)
donne3
comme décrit ci-dessusbbb
reçoit la valeur3
la source
aaa = 1, 2, 3
=> L'opérateur virgule est utilisé pour séparer les 3 énoncés suivants:aaa=1
,2
et3
. Le résultat de l'opérateur virgule est la valeur de la dernière instruction 3. Cependant, aaa reçoit la valeur 1, comme le montre clairement la capture d'écran de l'OP. La raison en est la priorité de l'opérateur, l'opérateur virgule ayant la priorité la plus basse.Dans le premier cas:
aaa = 1,2,3
les virgules servent de séparateurs d'expression. Il effectue une affectation à
aaa
, puis il la calcule2
et la rejette, puis la calcule3
et la rejette.Dans la seconde:
Le
var
mot-clé indique au compilateur Javascript que la prochaine chose après a,
devrait être un autre nom de variable. Il ne se trouve pas, alors il meurt et bâillonne.Ici, le compilateur l'évalue d'abord
1
et l'ignore. Ensuite, il l'évalue2
et l'ignore. Ensuite, il évalue3
et cela reste sur la pile afin qu'il soit affecté àbbb
Bien que l'utilisation de virgules pour séparer les expressions ne soit pas courante, elle est parfois utile dans des choses comme l'
for
apparence.la source