Javascript a une fonctionnalité appelée Insertion automatique des points-virgules. En gros, si l'analyseur rencontre un jeton non valide et que le dernier jeton précédent était un saut de ligne, il insère un point-virgule à l'emplacement du saut de ligne. Cela vous permet en principe d'écrire tout votre code javascript sans point-virgule, mais vous devez connaître certains cas extrêmes, surtout si vous avez un mot clé de retour puis la valeur que vous souhaitez renvoyer sur une nouvelle ligne.
function test(){
// This will return 'undefined', because return is a valid statement
// and "john" is a valid statement on its own.
return
"john"
}
À cause de ces pièges, des dizaines d'articles portant des titres tels que "L'insertion automatique des points-virgules est diabolique", "Toujours utiliser les points-virgules en Javascript", etc.
Mais en Python, personne n’utilise jamais les points-virgules et il a exactement les mêmes pièges.
def test():
# This will return 'undefined', because return is a valid statement
# and "john" is a valid statement on its own.
return
"john"
Fonctionne exactement de la même manière, et pourtant personne n’a une peur mortelle du comportement de Pythons.
Je pense que les cas où le javascript se comporte mal sont assez rares pour pouvoir les éviter facilement. Renvoyer + valeur sur une nouvelle ligne? Les gens font-ils vraiment beaucoup?
Des opinions? Utilisez-vous des points-virgules en javascript et pourquoi?
la source
#
pas «//».Réponses:
La raison en est qu’en Python, les nouvelles lignes constituent un moyen non équivoque de séparer les lignes de code; c'est par conception, et la façon dont cela fonctionne a été minutieusement réfléchie. En conséquence, le code python est parfaitement lisible et sans ambiguïté, sans aucun marqueur de fin d’instruction spécial (à l’exception de la nouvelle ligne).
En revanche, Javascript a été conçu avec une syntaxe de type C, les instructions se terminant toujours par un point-virgule. Pour rendre le langage plus tolérant aux erreurs, il essaie de deviner où le point-virgule supplémentaire doit aller pour corriger le code. Dans la mesure où cela a été adapté en quelque sorte à la syntaxe C, il ne fonctionne pas toujours comme prévu (parfois, l'interpréteur de script devine mal) et peut générer un code assez contre-intuitif.
Ou encore, argumenter en termes "explicite vaut mieux qu'implicite": en Python, une nouvelle ligne est déjà complètement explicite, alors qu'en Javascript, elle est ambiguë. Vous ajoutez donc le point-virgule pour le rendre explicite.
la source
Je pense que la façon dont cela fonctionne en Python présente une différence fondamentale. Citation de l'article Einar Egilsson: "un point-virgule n'est pas impliqué à la fin d'une ligne si le premier jeton de la ligne suivante peut être analysé dans le cadre de la même déclaration".
En Python, un saut de ligne termine toujours l'instruction, sauf dans certains cas assez évidents, comme dans une expression entre parenthèses. JavaScript, d’autre part, essaiera d’analyser autant de lignes que possible avant de terminer l’instruction, ce qui pourrait conduire à des choses comme celles-ci:
la source
(a + 1) ? do_something() : do_something_else();
et tout à coup, la zone est définie sur la valeur de retour dedo_something()
oudo_something_else()
et vous êtes complètement confus.Je minimise souvent mes fichiers JS en mode de production. Signifie, en supprimant les commentaires et les sauts de ligne.
Sans l'utilisation de points-virgules, cela briserait mon javascript.
la source
Cela ne fonctionne pas comme vous le décrivez.
C'est faux. Exemple:
1
est un jeton parfaitement valide, mais l'analyseur insérera toujours un point-virgule directement aprèsreturn
.Comme vous le voyez, même vous ne pouvez pas dire exactement où se produira un point-virgule.
Le problème avec l'insertion automatique est double:
Bien entendu, l’utilisation de points-virgules après chaque instruction n’aide que pour la première source d’erreurs.
En tout cas, comme vous pouvez le deviner à présent, je pense que l’insertion automatique de points-virgules dans la syntaxe C-like est une mauvaise idée.
la source
Je dirais une raison simple:
Javascript ressemble à "un peu java-ish" ou "un peu C-ish". Bien sûr, c'est un langage dynamique, donc ça a l'air différent ... mais regardons les choses en face: il y a des accolades. Les langues avec des accolades ont généralement des points-virgules. Les réflexes naturels entrent en jeu et font passer votre doigt vers la touche point-virgule avant de frapper Enter.
Python, au contraire, même d’un simple coup d’œil, est totalement différent. Par conséquent, peu ou pas d'analogie avec "les langages ennuyeux standard" est formée intuitivement et lorsque l'on entre dans le "mode python", l'absence de point-virgule est tout à fait naturelle.
la source
Il y a un certain nombre de bonnes raisons de ne pas utiliser l'insertion de point-virgule en JavaScript.
Cela est principalement dû au fait que l'insertion de point-virgule, telle que définie dans le standard ECMAScript, n'est pas intuitive dans certains cas. @Svante signale un cas
return
où l'utilisation de la nouvelle ligne posera problème.Ce qu'il ne mentionne pas, c'est que cela posera des problèmes si vous utilisez également des points-virgules, car l'insertion de points-virgules se produit que vous le vouliez ou non.
Une autre très bonne raison de ne pas utiliser l'insertion de point-virgule est le contrôle de sortie. Dans de nombreux cas, JavaScript est exécuté à l'aide d'un minifier avant d'être utilisé en production. Certains minifiers peuvent traiter les cas d'insertion automatique point-virgule, mais je ne vois aucune raison de compter sur elle fonctionne parfaitement
De plus, pour les systèmes de gestion de contenu, le code JavaScript en ligne peut être auto-minifié, et j'ai déjà vu plusieurs cas dans lesquels le minifieur automatique supprime simplement les commentaires et supprime les espaces (y compris les nouvelles lignes) à partir du début et de la fin de chaque ligne.
Pour les auteurs qui n'ont pas le choix des outils choisis, il est beaucoup plus facile de s'en tenir à un format qui fonctionne dans la grande majorité des cas.
la source
Ne pas utiliser de point-virgule est une recette d'échec lorsque vous réduisez vos fichiers en fichiers JavaScript. C'est pourquoi j'en ai peur.
la source
En Javascript, vous pouvez écrire un programme qui serait syntaxiquement correct en l'absence d'insertion de point-virgule automatique. ASI transformera ce programme en un programme syntaxiquement correct différent (par exemple, transformer un code renvoyant une valeur en un code ne renvoyant rien). Il n'y a pas de cas analogue en Python. En Python toute nouvelle ligne qui peut mettre fin à une déclaration sera fin à une déclaration, à moins qu'il est échappé avec une barre oblique inverse. Techniquement, je suppose que les règles de Javascript sont également déterministes, mais je ne sais pas si vous pouvez résumer les règles de Javascript pour les déclarations finales en une seule phrase.
la source
Dans la plupart des cas, l'ASI de JavaScript gère les choses comme prévu. Voici un exemple d'ASI qui ne se comporte peut-être pas comme prévu:
Ceci sera interprété comme appelant la fonction
0
avec la fonction anonyme, puis exécutant le résultat. Dans ce cas, vous souhaitiez probablement effectuer une affectation, puis exécuter immédiatement la fonction anonyme.Pour des personnes non familiarisées avec ASI, il peut être très déroutant de rencontrer de tels problèmes. Je recommande donc toujours aux développeurs de mon équipe d'utiliser des points-virgules.
(En passant: je n'utilise pas de points-virgules lorsque je travaille sur des projets personnels / secondaires, car je sais que personne d'autre n'aurait besoin de gérer le code.)
la source
Comme vous, je pense que c'est un peu paranoïaque. Les règles pour l'insertion de points-virgules sont bien définies en JavaScript, tout comme en Python et CoffeeScript. Personne ne lit Python ou CoffeeScript avec des points-virgules, alors pourquoi JavaScript est-il traité différemment?
Je pense que c'est une réaction excessive à la misère du code JavaScript typique d'il y a une dizaine d'années. JavaScript était perçu comme un langage faible, bogué, laid, pas bon. C'était gênant. Vous ne pourriez pas écrire un bon code en JavaScript!
Ensuite, les gens sont venus et ont essayé de prouver que vous pouviez écrire du code beau et clair en JavaScript. Le " règle toujours utiliser des points-virgules" faisait partie de cette vague. Et pour être honnête, certaines situations peuvent être un peu plus claires.
Pourquoi JavaScript est-il toujours traité différemment?
Il y a de l'inertie. Et il ne faut pas oublier que les personnes qui apprécient le code explicitement structuré préfèrent souvent les langages de type C. Les personnes qui apprécient le code implicitement structuré passent souvent à des langages de style non C (comme CoffeeScript).
la source
Je les utilise en Javascript strictement pour la cohérence. Si la plupart des lignes ont
Python les a pour les cas extrêmes tels que les déclarations multiples sur une seule ligne, javascript les a et comme vous les trouverez régulièrement utilisés, je me conforme à la norme où ils sont utilisés.
Je ne trouve pas d'utilisation pour plusieurs déclarations sur la même ligne et je ne prévois donc pas l'utilisation de points-virgules.
la source
Si vous utilisez quelque chose comme bundle-fu et le gestionnaire d'actifs pour votre application Web dans des rails, cela se briserait horriblement s'il ne rencontrait pas de point-virgule à la fin du jeton en javascript. C'est donc une bonne pratique d'en mettre un.
la source
Je ne me souviens plus de la version exacte d'IE, mais il y a des cas où IE va littéralement se tromper s'il manque un point-virgule. IIRC c'est quand vous avez dans le monde entier quelque chose comme:
Si vous n'ajoutez pas le; après l'accolade de fermeture, le programme échouera sur certaines versions d'IE. Cela, avec les autres raisons (y compris la recommandation de Crockford de toujours les utiliser explicitement), m'a amené à les utiliser explicitement dans tous les cas.
la source