什么时候使用分号?

时间:2016-08-08 07:03:47

标签: typescript coding-style

我知道JavaScript(以及TypeScript)在很多情况下都支持省略分号。不过,我想按照TypeScript Deep Dive

中的建议添加分号,使其明确无误

但是我找不到列出使用分号的指南。例如,请查看以下代码

@Override
public boolean preHandle(HttpServletRequest request,
        HttpServletResponse response, Object handler) throws Exception {
    // TODO Auto-generated method stub

    Pattern pattern = Pattern.compile("someregex");
    Matcher matcher = pattern.matcher(request.getPathInfo());

    if (matcher.find())
    {
        if (matcher.group(0).equals("SOMETHING"))
        {
            HandlerMethod handlerMethod = ((HandlerMethod)handler);
            request.setAttribute("methodName", handlerMethod.getBeanType().getSimpleName());
            request.getRequestDispatcher("/demo").forward(request, response);
            return false;
        }
        return true;
    }
    else
    {
        return true;
    }
}

我很确定在 A 处使用分号。但是 B C D 以及我的例子未涵盖的所有其他案例呢?

我不是在问哪些省略分号但在哪里添加它们。像总是这样的答案无法满足我的需求,因为我无法在class Person { private name: string; // A constructor(name: string) { this.name = name; }; // B public add = () => { return "C"; }; // C }; // D 之后添加;。我想知道在哪里准确地加分号。

4 个答案:

答案 0 :(得分:33)

只需以[(或`以分号开头的前缀行,您(几乎)为黄金*

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

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

我们根据此规则添加分号:

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

否则javascript认为我们正在尝试call(某些功能,或reference[某些数组。这更简单,更容易理解,并且在视觉上更容易发现。您还需要在for循环中使用分号,但.forEach method是一种更简洁,更简单的方法。我自信地说这一条规则涵盖了在javascript /打字稿中使用分号所需的99%的场景。

遵循此方法,将换行符与终止语句相关联非常重要。

*这将返回令人尊敬的undefined

  return 
          7

返回后,有一个换行符,浏览器插入一个分号,终止语句如下:

  return; // this will return undefined.
          7

请改为:

  return (
          7
  )

Javascript实际上是非常聪明的分号,有一个开放的paren,所以在找到关闭的paren之前不会插入分号。

如果您习惯在任何地方放置分号并且不确切知道何时需要它们,您可以阅读以下几页解释:http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding

我承认大多数人在每一行结束时仍然只会散落半冒号,但如果你是新人并且只是学习,这是更好的方法。

答案 1 :(得分:8)

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

这个错误就像唯一一个省略分号可能无法捕获你的实际意图的情况一样:

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

有一种情况,你的意图可能含糊不清,有一种不寻常的风格是用 [字符)开始一行,因为换行不会在这种情况下终止声明。绝大多数时间它正是你想要的,当它不是时,它是显而易见的,你可以想出一些有或没有分号的陈述(如上所示),这是有问题的。

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

答案 2 :(得分:7)

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工作的确切方式,他可能会感到很困惑。您可以通过将它们放在任何地方来为潜在的同事节省相当多的(不必要的)工作。

答案 3 :(得分:6)

与从C语法派生的other modern languages一样,JavaScript syntax was designed允许您在几乎所有情况下省略分号。我会说永远使用它们或永远使用它们*。要使用它们“永远不要”它的长短是每个语句都在一个新行上,并且永远不会与([`开始。< /强>

然而,要“永远”使用它们,你绝对应该使用JavaScript Standard Styleeslint built-in semi rule这样的linter来确保你避免使用以下几个问题:

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

以上内容被解释为a = b + c(d + e).foo();请注意,通过遵循上述规则而不开始使用(的行,这种情况就会被阻止。

另一个常见的例子如下:

return
{
     hello: "world"
};

乍一看,人们可能会认为这会被解释为返回一个对象,但实际上它被解释为return;以及在返回语句无法访问之后定义对象的代码。同样,通过遵循不以{开头的规则,这是可以避免的。

  • *好的,好吧,不是从不,但几乎从不。