68 votes

Quand est-il approprié d'utiliser un point-virgule?

Je sais que JavaScript (et donc TypeScript) supporte l'omission des points-virgules dans de nombreux cas. Néanmoins, je veux ajouter des points-virgules pour être non ambigu comme suggéré dans TypeScript Deep Dive

Cependant, je ne trouve pas de guide qui répertorie où utiliser le point-virgule. Par exemple, regardez le code suivant

class Person {
  private name: string; // A

  constructor(name: string) {
    this.name = name;
  }; // B

  public add = () => {
    return "C";
  }; // C
}; // D

Je suis assez sûr d'utiliser un point-virgule à A. Mais que dire de B, C, D et tous les autres cas non couverts par mon exemple?

Je ne demande pas où omettre le point-virgule mais où les ajouter. Une réponse comme toujours ne répond pas à mes besoins car je ne peux pas ajouter un ; après public. Je veux savoir où exactement mettre le point-virgule.

53voto

Devin G Rhode Points 3669

Il suffit de préfixer les lignes commençant par [, ( ou ` avec un point-virgule et vous êtes (presque) prêt*

En utilisant le même exemple qu'une autre réponse :

var x = { xx : "hello", yy : "world"}
(function () {
    console.log("Bonjour le monde");
})();

Nous ajoutons un point-virgule selon cette règle :

var x = { xx : "hello", yy : "world"}
;(function () {

sinon JavaScript pense que nous essayons d'appeler( une fonction, ou de référence[ dans un tableau. C'est plus simple, plus facile à suivre, et c'est visuellement plus facile à repérer. Vous avez également besoin de points-virgules dans les boucles for, mais la méthode .forEach est une méthode plus propre et plus facile. Je dirais avec confiance que cette règle couvre 99% des scénarios où vous avez besoin d'utiliser un point-virgule en JavaScript/TypeScript.

En suivant cette méthode, il est important d'associer un saut de ligne à la fin d'une instruction.

*Cela renvoie le vénérable undefined :

  return 
          7

Après le return, il y a un saut de ligne, et le navigateur insère un point-virgule, terminant ainsi l'instruction comme ceci :

  return; // cela renverra undefined.
          7

Faites plutôt ceci :

  return (
          7
  )

JavaScript est en réalité assez intelligent avec les points-virgules, il y a une parenthèse ouverte, donc aucun point-virgule n'est inséré jusqu'à ce que la parenthèse fermante soit trouvée.

Si vous avez l'habitude de mettre des points-virgules partout et de ne pas savoir exactement quand ils sont nécessaires, vous pourriez lire ceci pour une explication longue de plusieurs pages : http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding

J'admets que la plupart des gens continueront à mettre des points-virgules à la fin de chaque ligne, mais si vous êtes nouveau et en train d'apprendre, c'est une meilleure approche.

15 votes

La question porte sur TypeScript, mais toutes vos références sont à JavaScript. Éviter les points-virgules en TypeScript est tout à fait sûr car le compilateur considérera comme un code invalide celui qui aurait autrement posé des problèmes à l'exécution.

0 votes

En effet, je base tout cela sur mes connaissances en javascript. Merci d'avoir souligné que le compilateur TS renverra une erreur de temps de compilation. Je vais éditer ma réponse..

0 votes

Cette réponse que j'ai écrite avait pour objectif d'apporter un code plus propre à l'avenir, mais dans la plupart des situations, dans la plupart des entreprises, vous voulez probablement utiliser des points-virgules.. python gagne vraiment en popularité, et si nous POUVONS être plus comme python, en n'utilisant pas de points-virgules, alors nous DEVONS. Si vous collez mon code exemple dans typescriptlang.org/play, je trouve l'erreur assez difficile à comprendre (bien que je n'aie pas une expérience significative en TS, donc cela peut être un facteur).

14voto

activescott Points 4359

Comme certaines autres langues modernes dérivées de la syntaxe C, la syntaxe JavaScript a été conçue pour vous permettre d'omettre les points-virgules dans presque toutes les situations. Je dirais de les utiliser toujours ou de ne jamais les utiliser*. Pour ne jamais les utiliser, en gros, chaque instruction va sur une nouvelle ligne et ne commence jamais une ligne avec (, [ ou `.

Cependant, pour ne jamais les utiliser, vous devriez certainement utiliser un linter tel que JavaScript Standard Style ou eslint avec sa règle semi intégrée pour désactiver les points-virgules et sa règle no-unexpected-multiline qui veillera à ce que vous évitiez les quelques pièges tels que les suivants:

a = b + c
(d + e).foo()

Le code ci-dessus est interprété comme a = b + c(d + e).foo(); Notez qu'en suivant la règle ci-dessus et en ne commençant pas une ligne avec (, cette situation est évitée.

Un autre exemple courant est le suivant:

return
{
     hello: "world"
};

À première vue, on pourrait penser que cela sera interprété comme retournant un objet, mais c'est en fait interprété comme return; et le code pour définir l'objet après l'instruction de retour est inaccessible. Encore une fois, en suivant la règle de ne pas commencer une ligne avec {, cela est évité.


  • *D'accord, d'accord, pas jamais, mais presque jamais.

0 votes

Downvoted, parce qu'il y a deux erreurs : 1. Notez que en suivant la règle ci-dessus.. rien ne suit. 2. en suivant la règle de ne pas commencer une ligne avec { Cette parenthèse n'est pas mentionnée dans votre ensemble de règles.

1 votes

@angabriel Merci pour votre retour. Améliorons-le ensemble! Je n'ai pas réussi à comprendre ce que vous entendez par #1. L'énoncé auquel vous faites référence a clairement une suite. Pour votre deuxième point, bien que la configuration de JavaScript Standard Style contienne une protection contre les "pièges", si vous utilisez raw eslint, il n'y a pas de règle par défaut. J'ai donc ajouté une note sur la nécessité d'utiliser no-unexpected-multiline lors de l'utilisation d'ESLint pour éviter les "pièges". Faites-moi savoir ce que nous pouvons faire d'autre pour améliorer cette réponse pour la communauté.

0 votes

Bien. Après votre édition, je comprends les deux de vos arguments. L'exemple de retour est un cas un peu spécial cependant: La "règle" dit d'éviter uniquement les parenthèses ( et [ au début d'une nouvelle ligne, mais en combinaison avec une instruction de retour finale, il faut également éviter { sur la ligne suivante. Merci de maintenir la qualité! Upvoted ;)

10voto

Dylan Meeus Points 4292

Tu l’auras compris : Toujours

Gardez à l’esprit : mieux vaut prévenir que guérir

Vous devriez probablement les placer tout le temps. Vous n'avez pas besoin de les placer pour que TypeScript fonctionne, mais vous éviterez des erreurs en le faisant. ASI (Insertion automatique de point-virgule) fonctionne assez bien la plupart du temps, mais pas toujours. Voulez-vous vraiment rencontrer un problème juste parce que vous n'avez pas mis un point-virgule, et vous continuez à ignorer l'erreur ? (En fonction de votre IDE, l'erreur pourrait effectivement être détectée). Mais considérez ce JavaScript parfaitement valide.

 var x = { xx : "bonjour", yy : "monde"}
 (function () {
     console.log("Bonjour tout le monde");
 })();

Ceci est un code JavaScript valide (et donc TypeScript valide). Ce code donnera effectivement une erreur. TypeError non attrapée : (valeur intermédiaire)(valeur intermédiaire) n'est pas une fonction(…).

Ce qui pourrait être évité en plaçant simplement un point-virgule après la première ligne. Vous n'en avez pas besoin ici, et si la ligne suivante n'était pas celle de la fonction, cela fonctionnerait probablement correctement. Mais voulez-vous prendre ce risque ? Il semble que prendre le risque de commettre des erreurs pour un caractère supplémentaire ne vaille pas la peine à mes yeux. De plus, après un certain temps, vous avez simplement l'habitude de placer les points-virgules à la fin d'une ligne de toute façon;

Pensez à vos collègues

Une autre raison pour laquelle vous pourriez vouloir les utiliser tout le temps concerne les modifications de code. Votre collègue pourrait avoir à modifier votre code - et, ce faisant, pense que l'ASI continuera de fonctionner même avec sa modification du code. Imaginez que ce ne soit pas le cas, et que son changement entraîne effectivement une erreur dans l'ASI. Est-ce vraiment la peine de donner mal à la tête à votre collègue ? S'il modifie suffisamment de votre code et se retrouve soudainement confronté à de nombreuses erreurs, il pourrait être assez déconcerté s'il ne connaît pas exactement la manière dont l'ASI fonctionne. Vous pourriez épargner à un collègue potentiel beaucoup de travail (inutile) en les plaçant partout.

1 votes

Oui mais quand est-ce toujours? Je ne peux pas ajouter un point-virgule après tout ce qui introduirait des erreurs de syntaxe (et serait indéfiniment grand puisque je rajouterais ; après ;). Je ne demande pas si je devrais omettre le point-virgule. Je demande où les mettre.

1 votes

@ooxi à la fin de chaque déclaration ;-)

3 votes

Qu'est-ce qu'une instruction? Est-ce qu'une boucle for en est une (ce n'est pas une expression donc je suppose que oui)? Je n'ai jamais vu personne ajouter ; après le bloc d'une boucle for

8voto

Rick O'Shea Points 15

Vous devez veiller à ne pas ajouter involontairement des points-virgules, mais le meilleur moyen d'éviter ce bug auto-infligé est de ne pas les utiliser sauf là où la langue l'exige.

Ce bug est aussi probable que le seul cas où l'omission des points-virgules pourrait ne pas capturer votre réelle intention:

for(int i = 0; i < count; i++); do()

Il y a une situation où votre intention pourrait être ambiguë, avec le style inhabituel de commencer une ligne par un ( ou un caractère [, puisque le saut de ligne ne termine pas l'instruction dans ce cas. La grande majorité du temps, c'est précisément ce que vous voulez, c'est évident quand ce n'est pas le cas, et vous pouvez imaginer certaines instructions avec ou sans points-virgules (comme je l'ai montré ci-dessus) qui posent problème.

Je ne vais pas dire qu'il est irrationnel d'utiliser des points-virgules car c'est tellement ancré dans la culture, mais s'il vous plaît, ignorez la peur irrationnelle que beaucoup tentent de soutenir par une discussion embrouillée et inexacte de l'ASI ou des gestes de la main fous. C'est purement dogmatique, mes amis.

2 votes

Veillez uniquement suivre les conseils ci-dessus si : 1) vous connaissez spécification du langage JavaScript à 100% 2) vous aimez penser que oui et aimer frimer avec ce 'fait' aux autres. 3) vous aimez écrire des bogues obscurs et intraceables pour aucune raison valable.

1 votes

Ou si vous utilisez TypeScript... ce qui est tout le point de la question, car il vous avertira au moment de la compilation lorsqu'un point-virgule est manquant à un endroit qui aurait sinon pu entraîner des "erreurs inexplicables".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X