Considérons l'exemple que vous avez fourni:
var a = b = c = 100;
Cela équivaut à:
var a; // declare a
c = 100; // assign 100 to c
b = c; // assign 100 to b via c
a = b; // assign 100 to a via b
La chose est que JavaScript si vous attribuez une valeur à la variable que vous ne l'avez pas alors déclaré cette variable devient une variable globale. C'est la raison pour laquelle le code ci-dessus fonctionne. Toutefois, il pourrait aussi causer des problèmes comme dans cet exemple:
console.log("a", typeof a); // undefined
console.log("b", typeof b); // undefined
console.log("c", typeof c); // undefined
function foo(x) {
var a = b = c = x;
}
foo(100);
console.log("a", typeof a); // undefined
console.log("b", b); // 100
console.log("c", c); // 100
Qu'est-ce que vous voulez vraiment faire est:
var a = 100, b = a, c = b;
Cela équivaut à:
var a, b, c; // all variables are hoisted
a = 100;
b = a;
c = b;
Dans les déclarations de variables JavaScript sont tous hoisted en haut de la portée actuelle (étendue de fonction pour var
et étendue de bloc pour const
et let
). Cependant, les affectations se déroulent dans l'ordre de gauche à droite.Les variables déclarées mais non encore affectées ont la valeur undefined
.
Demandez-vous vraiment comment le compilateur lit le code, dans un langage interprété? – Daniel
Dans l'exemple, vous avez indiqué qu'une seule variable est déclarée (c'est-à-dire 'a'). La valeur 'b' est affectée à la valeur' c' à laquelle est affectée la valeur '100'. –