web-dev-qa-db-fra.com

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

Je sais que JavaScript (et donc TypeScript) prend en charge l'omission des points-virgules dans de nombreux cas. Néanmoins, je souhaite ajouter des points-virgules sans ambiguïté, comme suggéré dans TypeScript Deep Dive

Cependant, je ne trouve pas de guide qui indique 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 presque sûr d'utiliser un point-virgule à [~ # ~] et [~ # ~] . Mais qu'en est-il 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 de ; après public. Je veux savoir où mettre exactement le point-virgule.

39
ooxi

Juste les lignes commençant par [, (, ou `avec un point-virgule et vous êtes (presque) en or *

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

var x = { xx : "hello", yy : "world"}
(function () {
    console.log("Hello World");
})();

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

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

sinon, javascript pense que nous essayons de call( une fonction ou reference[ un tableau. C'est plus simple, plus facile à suivre et visuellement plus facile à repérer. Vous avez également besoin de points-virgules dans les boucles for, mais le .forEach méthode est une méthode plus propre et plus simple. Je dirais en toute confiance que cette règle couvre 99% des scénarios dont vous avez besoin pour utiliser un point-virgule dans javascript/TypeScript.

En suivant cette méthode, il est important d’associer une nouvelle ligne à la fin d’une instruction.

* Ceci retourne le vénérable undefined:

  return 
          7

Après le retour, il y a une nouvelle ligne et le navigateur insère un point-virgule, en terminant l'instruction comme ceci:

  return; // this will return undefined.
          7

Faites ceci à la place:

  return (
          7
  )

Javascript est en fait assez intelligent avec les points-virgules, il y a un paren ouvert, donc aucun point-virgule n'est inséré jusqu'à ce que le paren de fermeture soit trouvé.

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

J'admets que la plupart des gens ne font toujours que laisser des points-virgules à la fin de chaque ligne, mais si vous êtes nouveau et que vous apprenez, c'est la meilleure approche.

34
Devin G Rhode

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

Ce bogue est aussi probable que le seul et unique cas dans lequel omettre des points-virgules pourrait ne pas refléter votre intention réelle:

pour (int i = 0; i <nombre; i ++); faire()

Il existe un cas où votre intention peut être ambiguë, avec le style inhabituel de commencer une ligne avec un ( ou un [ caractère, car la nouvelle ligne ne met pas fin à la déclaration dans ce cas. La grande majorité du temps, c’est précisément ce que vous voulez, c’est évident si ce n’est pas le cas, et vous pouvez en imaginer déclarations avec ou sans point-virgule (comme je l’ai montré ci-dessus) qui posent problème.

Je ne dirai pas qu'il est irrationnel d'utiliser des points-virgules, car ils sont tellement enracinés dans la culture, mais veuillez ignorer la peur irrationnelle que beaucoup tentent de soutenir avec une discussion compliquée et inexacte d'ASI ou de la main folle. C'est pur dogme, les amis.

8
Rick O'Shea

TL; DR: 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 ainsi des erreurs. ASI (Automatic Semicolon Insertion) fonctionne assez bien la plupart du temps, mais pas toujours. Voulez-vous vraiment rencontrer un problème simplement parce que vous n'avez pas mis de point-virgule et que vous oubliez toujours l'erreur? (En fonction de votre IDE, l'erreur peut en réalité être capturée). Mais considérez ce Javascript parfaitement valide.

 var x = { xx : "hello", yy : "world"}
 (function () {
     console.log("Hello World");
 })();

Ceci est valide javascript (et donc valide TypeScript). Ce code va réellement donner une erreur. Uncaught TypeError: (intermediate value)(intermediate value) is not a function(…).

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 cette ligne de fonction, elle fonctionnerait probablement correctement. Mais vous voulez prendre ce risque? Il semble que prendre le risque d'erreurs sur un personnage supplémentaire ne vaut pas la peine pour moi. De plus, après un certain temps, vous commencez à vous habituer à placer des points-virgules au bout d'une ligne;

Pensez à vos collègues

Une autre raison pour laquelle vous pourriez vouloir les utiliser tout le temps est dans le cas du changement de code. Votre collègue devra peut-être changer votre code - et pense que ce faisant, l'ASI continuera à fonctionner même avec son changement de code. Imaginez que ce n'est pas le cas et que son changement fait en sorte qu'ASI fasse quelque chose de mal. Vaut-il vraiment la peine pour votre collègue? S'il modifie suffisamment votre code et qu'il rencontre soudainement de nombreuses erreurs, il risque d'être un peu confus s'il ne sait pas exactement comment ASI fonctionne. Vous pourriez économiser beaucoup de travail (inutile) à un collègue potentiel en le mettant simplement partout.

7
Dylan Meeus

Comme certains autres langages modernes dérivés 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 les utiliser "jamais", il faut que chaque instruction passe sur une nouvelle ligne et ne commence jamais une ligne avec (, [, ou `.

Cependant, pour les utiliser "jamais", vous devez absolument utiliser un linter tel que JavaScript Standard Style ou la règle semi intégrée eslint qui vous évitera les quelques pièges tels que les suivants:

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

Ce qui précède 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 par (, Cette situation est évitée.

Un autre exemple courant est le suivant:

return
{
     hello: "world"
};

D'un coup d'œil, on peut penser que cela sera interprété comme renvoyant un objet, mais en réalité, il est interprété comme return; Et le code permettant de définir l'objet après que l'instruction return soit inaccessible. Encore une fois, en suivant la règle de ne pas commencer une ligne avec {, Ceci est évité.


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