什么时候适合使用分号?

我知道 JavaScript (以及 TypeScript)在许多情况下支持省略分号。尽管如此,我想添加分号,以明确的建议在 深潜

但是我找不到列出在哪里使用分号的指南

class Person {
private name: string; // A


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


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

我相当肯定在 A使用分号。但是对于 BCD和所有其他情况下没有涵盖我的例子?

我不是问在哪里省略分号,而是问在哪里加分号。像 一直都是这样的答案不能满足我的需要,因为我不能在 public后面加上 ;。我想知道分号到底放在哪里。

44517 次浏览

总是

记住: 小心驶得万年船

你应该一直把它们放在那里。您不需要为了让 TypeScript 工作而将它们放置在 需要中,但是这样做可以避免错误。ASI (自动分号插入)在大多数情况下运行良好,但并非总是如此。你真的想因为你没有加分号而一直忽略这个错误而遇到麻烦吗?(根据您的 IDE,错误可能真的会被发现)。但是考虑一下这个完全有效的 Javascript。

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

这是有效的 javascript (也就是有效的打字稿)。这段代码实际上会给出一个错误。

这可以通过在第一行后面放一个分号来避免。这里不需要它,如果下一行不是那个函数行,它可能会正常工作。但你想冒这个险吗?似乎为了一个额外的字符而冒险犯错对我来说不值得。另外,一段时间之后,你就会习惯在一行的末尾放置分号;

想想你的同事

您可能希望始终使用它们的另一个原因是在代码更改的情况下。您的同事可能必须更改您的代码-并且在这样做时认为,即使他的代码更改,ASI 也将继续工作。想象一下,事实并非如此,他的改变实际上使 ASI 做了错误的事情。真的值得你的同事为此头疼吗?如果他修改了足够多的代码,然后突然遇到很多错误,如果他不知道 ASI 工作的确切方式,他可能会感到相当困惑。你可以把一个潜在的同事放在任何地方,这样可以节省很多(不必要的)工作。

您需要注意不要无意中添加分号,但是避免自己造成 bug 的最好方法是除非语言要求,否则不要使用它们。

这个 bug 很可能就是省略分号可能无法捕捉到您的实际意图的唯一情况:

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方法是一种更简洁、更容易的方法。我可以自信地说,这条规则涵盖了在 javascript/typecript 中使用分号所需的99% 的场景。

遵循这种方法,对于 将换行符与结束语句联系起来。来说很重要

* 返回值得尊敬的 undefined:

  return
7

返回后,有一个换行符,然后浏览器插入一个分号,结束语句,如下所示:

  return; // this will return undefined.
7

不如这样做:

  return (
7
)

Javascript 实际上使用分号非常聪明,有一个开括号,所以在找到结束括号之前不会插入分号。

如果你有在任何地方放分号的习惯,并且不知道什么时候需要分号,你可以阅读这篇长达几页的解释: http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding

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

像一些从 C 语法派生的 其他现代语言一样,设计了 JavaScript 语法允许在几乎所有情况下省略分号。我会说要么永远用,要么永远不用。使用他们“从来没有”的长和短它是那 每个语句都以新行开始,绝不以 ABC0、 ABC1或 `开始。

然而,要使用它们“从不”,你一定要使用一个类似于 JavaScript 标准样式或者 eslint 的 linter,它的 内置 semi规则禁用分号和它的 no-unexpected-multiline规则,这样可以确保你避免一些陷阱,比如:

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

以上解释为 a = b + c(d + e).foo();注意,通过遵循上述规则,不以 (开始一行,这种情况是可以避免的。

另一个常见的例子如下:

return
{
hello: "world"
};

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


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