什么时候使用分号合适?

When is it appropriate to use a semicolon?

我知道 JavaScript(因此 TypeScript)在很多情况下都支持省略分号。尽管如此,我还是想按照 TypeScript Deep Dive

中的建议添加分号以明确

但是我找不到列出在哪里使用分号的指南。例如看下面的代码

class Person {
  private name: string; // A

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

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

我很确定在 A 处使用分号。但是 BCD 以及我的示例未涵盖的所有其他情况呢?

我不是问在哪里省略分号,而是在哪里添加分号。 always 之类的答案无法满足我的需求,因为我无法在 public 之后添加 ;。我想知道分号放在哪里。

TL;DR:总是

记住:安全总比后悔好

您可能应该一直放置它们。您不需要放置它们以使 TypeScript 工作,但这样做可以避免错误。 ASI(自动分号插入)大部分时间都运行良好,但并非总是如此。你真的想运行成问题,只是因为你没有输入分号,而你一直忽略错误吗? (根据您的 IDE,错误实际上可能会被发现)。但是考虑一下这个完全有效的 Javascript.

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

这是有效的 javascript(因此有效的打字稿)。这段代码实际上会报错。 Uncaught TypeError: (intermediate value)(intermediate value) is not a function(…)

这可以通过在第一行之后放置一个分号来避免。你在那里不需要它,如果下一行不是那个功能行,它可能会正常工作。但是你想冒这个风险吗?对我来说,冒着多出一个角色犯错的风险似乎不值得。另外,一段时间后,您就会习惯于在行尾放置分号;

想想你的同事

您可能希望一直使用它们的另一个原因是在代码更改的情况下。您的同事可能不得不更改您的代码 - 并且在这样做时认为即使他的代码更改,ASI 也会继续工作。想象一下,事实并非如此,他的改变实际上让ASI做错了什么。真的值得让您的同事头疼吗?如果他更改了足够多的代码然后突然 运行 出现很多错误,如果他不知道 ASI 的确切工作方式,他可能会很困惑。只需将它们放在各处,您就可以为潜在同事节省很多(不必要的)工作。

您需要注意不要无意中添加分号,但避免这种自我造成的错误的最佳方法是不要使用分号,除非语言需要。

此错误的可能性与唯一一个省略分号可能无法捕捉您的实际意图的情况一样:

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

在一种情况下,您的意图可能不明确,以 ([ 开始一行的不寻常风格字符,因为在那种情况下换行符不会终止语句。绝大多数时候它正是你想要的,当它不是时很明显,你可以想出一些带或不带分号的语句(如我上面所示)有问题。

我不会说使用分号是不合理的,因为它在文化中根深蒂固,但请忽略许多人试图通过对 ASI 的复杂和不准确的讨论或疯狂挥手来支持的非理性恐惧。朋友们,这是纯粹的教条。

只需在以 [( 或 ` 开头的行前加上分号,您就(几乎)是黄金*

使用与另一个答案相同的例子:

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

我们按照这个规则加分号:

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

否则 javascript 认为我们正在尝试 call( 一些函数,或者 reference[ 一些数组。这更简单,更容易遵循,并且在视觉上更容易发现。您还需要在 for 循环中使用分号,但 .forEach method 是一种更简洁、更简单的方法。我可以自信地说,这条规则涵盖了 99% 的需要在 javascript/typescript.

中使用分号的场景

按照此方法,将换行符与终止语句相关联很重要。

*这位return尊者undefined:

  return 
          7

在return之后有一个换行符,浏览器插入一个分号,像这样终止语句:

  return; // this will return undefined.
          7

改为这样做:

  return (
          7
  )

Javascript 使用分号实际上很聪明,有一个左括号,所以在找到右括号之前不会插入分号。

如果您习惯于到处使用分号并且不知道何时需要分号,您可以阅读这篇长达数页的解释:http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding

我承认大多数人仍然会在每一行的末尾乱加分号,但如果您是新手并且只是在学习,这是更好的方法。

像某些 other modern languages derived from the C syntax, JavaScript syntax was designed 一样,允许您在几乎所有情况下省略分号。我会说总是使用它们或从不使用它们*。要“从不”使用它们,总而言之 每个语句都在一个新行上,并且永远不会以 ([` 开始一行.

但是,要“从不”使用它们,您绝对应该使用诸如 JavaScript Standard Style or eslint with its built-in semi rule to disable semicolons and its no-unexpected-multiline rule 之类的 linter,这将确保您避免以下几个问题:

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

以上解释为a = b + c(d + e).foo(); 请注意,通过遵循上述规则并且不以 ( 开头的行可以防止出现这种情况。

另一个常见的例子如下:

return
{
     hello: "world"
};

乍一看可能会认为这会被解释为returning一个对象,但实际上它被解释为return;和在return语句之后定义对象的代码无法到达。同样,遵循不以 { 开头的规则可以避免这种情况。


  • *好吧好吧,不是从来没有,但几乎从来没有。