Je ne pouvais pas trop bien comprendre ces 3 règles dans les spécifications - j'espère avoir quelque chose qui est plus simple en anglais - mais voici ce que j'ai recueilli de JavaScript: The Definitive Guide, 6th Edition, David Flanagan, O'Reilly, 2011:
Citation:
JavaScript ne traite pas chaque saut de ligne comme un point-virgule: il traite généralement les sauts de ligne comme des points-virgules uniquement s'il ne peut pas analyser le code sans les points-virgules.
Une autre citation: pour le code
var a
a
=
3 console.log(a)
JavaScript ne traite pas le deuxième saut de ligne comme un point-virgule car il peut continuer d'analyser l'instruction plus longue a = 3;
et:
deux exceptions à la règle générale selon laquelle JavaScript interprète les sauts de ligne comme des points-virgules lorsqu'il ne peut pas analyser la deuxième ligne en tant que continuation de l'instruction sur la première ligne. La première exception concerne les instructions return, break et continue
... Si un saut de ligne apparaît après l'un de ces mots ... JavaScript interprétera toujours ce saut de ligne comme un point-virgule.
... La deuxième exception concerne les opérateurs ++ et −− ... Si vous souhaitez utiliser l'un de ces opérateurs comme opérateurs postfix, ils doivent apparaître sur la même ligne que l'expression à laquelle ils s'appliquent. Sinon, le saut de ligne sera traité comme un point-virgule, et le ++ ou - sera analysé comme un opérateur de préfixe appliqué au code qui suit. Considérez ce code, par exemple:
x
++
y
Il est analysé comme x; ++y;
, pas commex++; y
Je pense donc que pour simplifier, cela signifie:
En général, JavaScript traitera comme continuation du code aussi longtemps qu'il est logique - sauf 2 cas: (1) après quelques mots clés comme return
, break
, continue
et (2) si elle voit ++
ou --
sur une nouvelle ligne, il ajoutera le ;
à la fin de la ligne précédente.
La partie sur "le traiter comme une continuation de code aussi longtemps que cela a du sens" donne l'impression d'une correspondance gourmande d'expression régulière.
Cela dit, cela signifie return
qu'avec un saut de ligne, l'interpréteur JavaScript insère un;
(cité à nouveau: si un saut de ligne apparaît après l'un de ces mots [tels que return
] ... JavaScript interprétera toujours ce saut de ligne comme un point-virgule)
et pour cette raison, l'exemple classique de
return
{
foo: 1
}
ne fonctionnera pas comme prévu, car l'interpréteur JavaScript le traitera comme:
return; // returning nothing
{
foo: 1
}
Il ne doit pas y avoir de saut de ligne immédiatement après return
:
return {
foo: 1
}
pour qu'il fonctionne correctement. Et vous pouvez insérer un ;
vous-même si vous deviez suivre la règle d'utilisation d'un ;
après n'importe quelle déclaration:
return {
foo: 1
};