JSLint支持If-Block

Pet*_*son 10 javascript jslint

在Javascript中,如果if表达式后面没有大括号,则将以下语句放入if块中.那是,

if(foo)
bar();
baz();
Run Code Online (Sandbox Code Playgroud)

相当于

if(foo) {
  bar();
}
baz();
Run Code Online (Sandbox Code Playgroud)

道格拉斯·克罗克福德建议不要使用第一个,因为如果程序员试图在if没有括号的情况下向一个块添加语句,那么它会让人感到困惑并且可能导致难以追踪的错误.出于这个原因,JsLint抱怨你是否使用第一个表格.

我一直都在使用它,如果你把语句与语句放在同一行,我认为这是一个非问题if,如下所示:

if(foo) bar();
baz();
Run Code Online (Sandbox Code Playgroud)

这在视觉上比完整的支架形式更简洁,我从来没有与它混淆.就这样我可以通过JsLint并且没有那么多的视觉噪音我有时会使用一种依赖于操作员短路的较少惯用的形式,如下所示:

foo && bar();
baz();
Run Code Online (Sandbox Code Playgroud)

你可能都在等我快点问一个问题,所以这就是: 如果你正确地格式化,在一行条件语句中不使用大括号通常被认为是不好的做法吗?为什么?JsLint有没有合理的理由抱怨它?

Emi*_*nov 5

JSLint检查您的代码是否为Crockford样式.它有一个名为JSHint的分支,它可以自定义,并且不那么烦人.

这是一个验证良好的代码(除了可能很快修复小bug)

/*jshint curly: false */

var a = true;
function work() {
    console.log('work');
}

if (a) work();
Run Code Online (Sandbox Code Playgroud)

  • 克罗克福德是**仁慈的独裁者.遵循他的忠告是明智的. (3认同)
  • "卷曲:假"的垮台是它不会抱怨原始的坏形式.我们需要的是一个"smartcurly:true",它会抱怨错过curlies,除非它们是单行if语句.这在道德上类似于"smarttabs",它不会抱怨使用空格进行'对齐'的缩进块缩进(例如,"\ t/**\n\t*blah \n\t*blah \n\t*/") (3认同)

Fed*_*rón 4

在阅读中:

  • 您可能不习惯这种编码风格,并且可能认为这会执行两个函数:

    if(foo) bar();
            baz();
    
    Run Code Online (Sandbox Code Playgroud)
  • 由于 JS 具有自动插入分号的功能,因此还有更模糊的情况。例如,我对 ASI 对这段代码的处理感到不满意,即使我可以推理出来:

    if(foo) bar()
            baz()
    
    Run Code Online (Sandbox Code Playgroud)

    如果你知道 ASI 的作用,那么弄清楚甚至很难,但 ASI 是一个不平凡的算法。必须在头脑中运行它在时间方面是昂贵的,因此最好避免模棱两可(从这个意义上说,根据 ECMA-262 规范不模棱两可)的情况。

  • 它使您的线条比需要的更长。根据您的编码约定,这可能被认为不是问题,如果您的条件很长,并且您的语句也很长,则生成的单行语句将更费眼睛阅读(众所周知,您的眼睛很难阅读非常孤立的行,因此需要分段)。

    如果出于某种原因尽管使用大括号,您仍然可以使用以下形式的内容:

    if(foo)
        bar();
    
    Run Code Online (Sandbox Code Playgroud)

    这实际上与您的代码相同,但在这一点上我认为没有理由不将大括号放在那里。

书面:

  • 当您需要添加另一条语句时,您不会简单地编写它。为此,您必须重构周围区域。再说一次,这根本不难,但这是需要额外考虑的事情,它与你的问题或问题的解决方案无关,它只是一个语法上的怪癖。

    我想你已经明白了这一点,但这是这样的场景。

    初始代码:

    if(foo) bar();
    
    Run Code Online (Sandbox Code Playgroud)

    更改后的代码:

    if(foo) bar(); baz();
    
    Run Code Online (Sandbox Code Playgroud)

    你可以清楚地看到问题,但它不一定会在例行代码审查中出现。如果您的测试用例未涵盖此特定代码路径,则可能会由于重复的编码器监督而被推入生产环境,而通过不要求显式分隔块,这会变得更容易。正如您所拥有的,您可以采用的解决方案是说类似 的内容if(foo) bar() && baz(),但如果是假的话,就会失败bar(),所以您最终会得到丑陋的东西,例如if(foo) (bar(), baz());虽然有效,但绝对非常丑陋。


if就我个人而言,我仅在行很短且算法本身也很短时才使用单行语句。类似if(extra_loop) --i;or当你开始向这些单行 if 中if(!valid) break;添加s 时,该结构的操作变得越来越危险。else

简而言之,您可以使用它,但要像使用其他工具一样了解其优缺点。