var var1 = 1,
var2 = 1,
var3 = 1;
C'est équivalent à ceci:
var var1 = var2 = var3 = 1;
Je suis assez certain que c'est l'ordre dans lequel les variables sont définies: var3, var2, var1, ce qui équivaudrait à ceci:
var var3 = 1, var2 = var3, var1 = var2;
Existe-t-il un moyen de le confirmer en JavaScript? Vous utilisez éventuellement un profileur?
javascript
variables
variable-assignment
David Calhoun
la source
la source
this.var1 = this.var2 = this.var3 = 1
?Réponses:
Réellement,
n'est pas équivalent à:
La différence réside dans la portée:
En fait, cela montre que les affectations sont bien associatives. L'
bad
exemple est équivalent à:la source
var var1=var2
se produit aprèsvar3 = 1
et aprèsvar2 = var3
. c'est commevar3=1; var2=var3; var var1=var2
var v1, v2, v3;
puis plus tard:v1 = v2 = v3 = 6;
ils seront toujours dans la portée locale. Puisque David a mentionné des alertes, cela fonctionnerait comme prévu (si pré-var'd):alert(v1 = v2 = v3 = 6);
L'affectation en javascript fonctionne de droite à gauche.
var var1 = var2 = var3 = 1;
.Si la valeur de l'une de ces variables est
1
après cette instruction, alors logiquement, elle doit avoir commencé à partir de la droite, sinon la valeur ouvar1
etvar2
ne serait pas définie.Vous pouvez le considérer comme équivalent à l'
var var1 = (var2 = (var3 = 1));
endroit où l'ensemble de parenthèses le plus intérieur est évalué en premier.la source
(
immédiatement aprèsvar
. Retrait de l'ensemble extérieur de parenthèses permet de compiler sans erreur,var var1 = (var2 = (var3 = 1));
. À l'époque, je pensais que cela n'illustrait pas aussi bien ce point, mais je suppose que c'est la même chose.var var1 = var2 = var3 = 1;.
égal àvar var3 = 1; var var2 = var3; var var1 = var2;
Dans ce cas, le
var
mot-clé est applicable aux trois variables.ce qui n'est pas équivalent à ceci:
Dans ce cas, le
var
mot-clé derrière les écrans n'est applicable qu'à envar1
raison du levage des variables et le reste de l'expression est évalué normalement, de sorte que les variablesvar2, var3
deviennent globalesJavascript traite ce code dans cet ordre:
la source
(a && b)
est logiquement(a ? b : a)
et se comporte comme une multiplication (par exemple.!!a * !!b
)(a || b)
est logiquement(a ? a : b)
et se comporte comme l'addition (par exemple.!!a + !!b
)(a = 0, b)
est court pour ne pas se soucier sia
c'est la vérité, retourb
Priorité des opérateurs JavaScript (ordre des opérations)
Notez que l'opérateur virgule est en fait l'opérateur le moins privilégié, mais que les parenthèses sont les plus privilégiées et qu'elles vont de pair lors de la construction d'expressions sur une ligne.
Finalement, vous aurez peut-être besoin de «thunks» plutôt que de valeurs codées en dur, et pour moi, un thunk est à la fois la fonction et la valeur résultante (la même «chose»).
la source
Essaye ça:
Notez le simple '=' dans la première alerte. Cela montrera que le résultat d'une expression d'affectation est la valeur assignée, et la deuxième alerte vous montrera que l'affectation s'est produite.
Il s'ensuit logiquement que l'affectation doit s'être enchaînée de droite à gauche. Cependant, comme tout cela est atomique pour le javascript (il n'y a pas de threading), un moteur particulier peut choisir de l'optimiser un peu différemment.
la source
Il est clair maintenant qu'ils ne sont pas les mêmes. La façon de coder c'est
Et, qu'en est-il de l'affectation de laissez? Exactement la même chose que var, ne laissez pas l'attribution de let vous dérouter à cause de la portée du bloc.
Nous pourrions faire ce qui suit:
Remarque: btw, je ne recommande pas d'utiliser plusieurs affectations, pas même plusieurs déclarations dans la même ligne.
la source
coffee-script
peut accomplir cela avec aplomb.la source