JavaScript中的单行语句中是否需要大括号?

Tow*_*wer 142 javascript

我曾经听说过将花括号留在单行语句中可能会对JavaScript产生不利影响.我不再记得推理了,谷歌搜索也没多大帮助.在JavaScript中用花括号括起所有语句是否有任何好处?

我问,因为每个人似乎都这样做.

Jos*_*h K 177

没有

但他们是推荐的.如果你扩展声明,你将需要它们.

这完全有效

if (cond) 
    alert("Condition met!")
else
    alert("Condition not met!")
Run Code Online (Sandbox Code Playgroud)

但是,强烈建议您始终使用大括号,因为如果您(或其他人)扩展了语句,则需要使用大括号.

所有使用支撑的C语法风格语言都遵循相同的做法.C,C++,Java,甚至PHP都支持一行语句,没有大括号.你必须意识到你只保存了两个角色,而且有些人的支撑风格你甚至都没有保存一条线.我更喜欢全支撑式(如下),所以它往往会更长一点.由于您具有非常清晰的代码可读性,因此可以很好地满足这种权衡.

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}
Run Code Online (Sandbox Code Playgroud)

  • +1,信息丰富的答案.就个人而言,我从未发现做这个"推荐"的事情是有用的.我从来没有编写python,所以我不只是插入东西并期望缩进很重要.如果我添加一个语句,我还添加大括号.总是.不记得一次它咬我.不是在C中,不在C#中而不是在JavaScript中. (21认同)
  • @Kirk:Douglas Crockford推荐它.我同意这是一个主观的个人决定,但是当在一个小组中工作时,更容易简单地键入大括号. (15认同)
  • 我个人的经验表明,在团队工作时,不放置护腕可能会导致严重的失误. (10认同)
  • @Josh,哦,Crockford说得好.那一定是最后一句话.;)(开玩笑)问题是这一点的主观性扩展到所有类C语言,并且可以在整个(两个位置)找到强烈的意见. (8认同)
  • 始终使用大括号{}是一种很好的做法.正如@Arx所说,如果你把它们排除在外,还有更多的错误空间.Apple甚至在iOS的SSL/TLS中有[bug](https://www.imperialviolet.org/2014/02/22/applebug.html),因为他们没有使用大括号 (4认同)
  • 也许我应该补充一点,因为代码应该以这种方式看待我的工作场所,因此我已经开始在所有地方都使用花括号。而且,由于它是“推荐的”,也许最好实践大多数人在做什么,而不是仅仅因为它对您有用而走自己的路。 (2认同)
  • 在单独的行上使用花括号,我永远不会将它们用于单语句块.8对4线有很大差异. (2认同)
  • 这是偏好,但不包括括号,存在巨大的错误倾向.不要低估人为错误.识别缺失的支架比识别空白问题更容易. (2认同)
  • "强烈推荐" - 对于那些至少无论如何都无法保持一致压痕的人:) (2认同)
  • 我从不使用花括号作为单一陈述.我写的代码尽可能少.是反叛者.如果你不需要它们,请不要使用它们;)我的大多数同事都同意.如果您需要2个或更多语句,则添加大括号.永远不会绊倒我. (2认同)

Rud*_*udu 87

有一个可读性方面 - 因为当你有复合语句时,它会变得非常混乱.(缩进有帮助,但对编译器/解释器没有任何意义)

var a;
var b;
var c;

//Indenting is clear
if (a===true)
  alert(a); //Only on IF
alert(b); //Always

//Indenting is bad
if (a===true)
  alert(a); //Only on IF
  alert(b); //Always but expected?

//Nested indenting is clear
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
alert (b); //Always

//Nested indenting is misleading
if (a===true)
  if (b===true)
    alert(a); //Only on if-if
  alert (b); //Always but expected as part of first if?

//Compound line is misleading
//b will always alert, but suggests it's part of if
if (a===true) alert(a);alert(b); 
else alert(c); //Error, else isn't attached
Run Code Online (Sandbox Code Playgroud)

然后有一个可扩展性方面:

//Problematic
if (a===true)
  alert(a);
  alert(b); //We're assuming this will happen with the if but it'll happen always
else       //This else is not connected to an if anymore - error
  alert(c);

//Obvious
if (a===true) {
  alert(a); //on if
  alert(b); //on if
} else {
  alert(c); //on !if
} 
Run Code Online (Sandbox Code Playgroud)

(我们的想法是,如果你总是有括号,那么你就知道在该块中插入其他语句).

  • 这就是为什么我们应该始终将其用作单行:`if (a===true) alert(a);`。现在很清楚了! (7认同)

pea*_*rth 51

这个问题在一行上询问有关陈述的问题.然而,提供的许多示例显示了不基于多行语句省略括号的原因.如果这是您喜欢的编码风格,那么在一行上不使用括号是完全安全的.

例如,问题是否可以:

 if (condition) statement;
Run Code Online (Sandbox Code Playgroud)

它不会问这是否可以:

 if (condition)
   statement;
Run Code Online (Sandbox Code Playgroud)

我认为将括号括起来是更可取的,因为它使代码更易读,语法更少.

我的编码风格是永远不要使用括号,除非代码是一个块.并且永远不要在一行上使用多个语句(以分号分隔).我发现这很容易阅读和清楚,并且从未在'if'语句中出现范围问题.因此,在单个if条件语句中使用括号将需要3行.像这样:

 if (condition) {
   statement;
 }
Run Code Online (Sandbox Code Playgroud)

使用一行if语句是首选,因为它使用较少的垂直空间并且代码更紧凑.

我不会强迫其他人使用这种方法,但它对我有用,我不能不同意提供的关于如何省略括号导致编码/范围错误的示例.

  • 然而您忘记了大多数代码格式化程序将其更改为 2 行格式,并且您又回到了有问题的代码。垂直空间的争论是愚蠢的。可读性总是胜出,而且今天的屏幕很大。 (3认同)
  • 与维护代码(即使是非常细心的开发人员)可能造成的潜在损害相比,为每个括号添加两行来包围您的一行语句并不是很大的成本。您自己可以成为一名拥有神话般技能的伟大开发人员,但您不能假设您的同事也是。KISS,用上下文来包装事情,并让其他人尽可能容易,否则你最终会遇到麻烦。 (3认同)
  • 我一直觉得一个应该总是包括括号......但我现在重新考虑它。你身边有 [airbnb](https://github.com/airbnb/javascript#blocks) 风格指南! (2认同)

Can*_*ner 15

技术上没有,但绝对是的!

忘记"这是个人偏好","代码运行得很好","它一直对我很好","它更具可读性"yada yada BS.如果你犯了一个错误,这很容易导致非常严重的问题并且相信我在你编码时很容易犯错误(不要相信?,查看着名的Apple会失败的bug).

争论:"这是个人喜好"

不它不是.除非你是一个离开火星队的单人队,否则没有.大多数时候会有其他人阅读/修改您的代码.在任何严肃的编码团队中,这将是推荐的方式,因此它不是"个人偏好".

争论:"代码运行得很好"

意大利面条代码也是如此!这是否意味着可以创建它?

争论:"它对我来说一直很好"

在我的职业生涯中,由于这个问题我已经看到了很多错误.你可能不记得你评论了多少次,'DoSomething()'并为什么'SomethingElse()'被称为困惑:

if (condition) 
    DoSomething();
SomethingElse();
Run Code Online (Sandbox Code Playgroud)

或添加'SomethingMore'并且没有注意到它不会被调用(即使缩进意味着其他情况):

if (condition)
  DoSomething();
  SomethingMore();
Run Code Online (Sandbox Code Playgroud)

这是我的真实例子.有人想要关闭所有日志记录,以便运行find&replace "console.log"=> //"console.log":

if (condition) 
   console.log("something");
SomethingElse();
Run Code Online (Sandbox Code Playgroud)

看到问题?

即使你认为,"这些都是微不足道的,我永远不会这样做"; 请记住,总会有一个团队成员的编程技能低于你(希望你不是团队中最糟糕的!)

争论:"它更具可读性"

如果我已经学习了任何有关编程的知识,那就是简单的事情会很快变得非常复杂.这很常见:

if (condition) 
    DoSomething();
Run Code Online (Sandbox Code Playgroud)

在使用不同的浏览器/环境/用例进行测试或添加新功能后,将变为以下内容:

if (a != null)
   if (condition) 
      DoSomething();
   else
      DoSomethingElse(); 
      DoSomethingMore();
else 
    if (b == null)
         alert("error b");
    else 
         alert("error a");
Run Code Online (Sandbox Code Playgroud)

并将其与此进行比较:

 if (a != null) {
    if (condition) { 
       DoSomething();
    }
    else {
       DoSomethingElse();
       DoSomethingMore();
    }
 } else if (b == null) {
    alert("error b");
 } else {
    alert("error a");
 }
Run Code Online (Sandbox Code Playgroud)

PS:奖励积分转到谁注意到上面例子中的错误.

  • 通过你的例子,你的开发团队根本不知道如何编码,大括号对他们没有帮助...... (3认同)
  • 好吧,明显的错误是DoSomethingMore(); 但还有另一个错误.如果a为null且b为null,则只获得"错误b",您永远不会得到"错误a". (2认同)

wil*_*alo 11

没有可维护性问题!

你们所有人的问题在于你到处都是分号.多个语句不需要花括号.如果要添加语句,只需使用逗号即可.

if (a > 1)
 alert("foo"),
 alert("bar"),
 alert("lorem"),
 alert("ipsum");
else
 alert("blah");
Run Code Online (Sandbox Code Playgroud)

这是有效的代码,将按您的预期运行!

  • 这太可怕了.如果有人添加一个语句并忘记将分号转换为块中现在倒数第二个语句的逗号,那么你就会发现一个很难发现的错误,因为该行末尾的逗号和分号看起来很难看方式太相似了. (12认同)
  • 虽然这在JavaScript中有效,但是为什么你会想要这样做呢?我猜想大多数开发人员都没有意识到这一点(在阅读之前我自己也包括在内),我怀疑这会很快成为开发人员之间的可维护性问题.有时候,最聪明的方式并不是最好的. (10认同)
  • 我以前从未见过这个,用逗号表示多个语句!!!!!! (3认同)
  • 你不是指`if`,`else`和`alert`而不是`If`,`Else`和`Alert`? (2认同)

Chr*_*her 7

除了@Josh K(也适用于Java,C等)提到的原因之外,JavaScript中的一个特殊问题是自动分号插入.来自维基百科的例子:

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;
Run Code Online (Sandbox Code Playgroud)

因此,如果像这样使用,这也可能产生意想不到的结果:

if (x)
   return
   a + b;
Run Code Online (Sandbox Code Playgroud)

写作并不是真的好多了

if (x) {
   return
   a + b;
}
Run Code Online (Sandbox Code Playgroud)

但也许在这里错误更容易检测(?)


Yog*_*gi 7

总是发现

if(valid) return;
Run Code Online (Sandbox Code Playgroud)

对我的眼睛来说更容易

if(valid) {
  return;
}
Run Code Online (Sandbox Code Playgroud)

也有条件的,比如

(valid) ? ifTrue() : ifFalse();
Run Code Online (Sandbox Code Playgroud)

更容易阅读(我个人的意见)而不是

if(valid) {
  ifTrue();
} else {
  ifFalse();
}
Run Code Online (Sandbox Code Playgroud)

但我想这取决于编码风格


Yah*_*hel 6

没有编程原因在一行语句上使用花括号。

这仅取决于编码人员的喜好和可读性。

您的代码不会因此而中断。


小智 6

这是一个风格问题,但花括号有助于防止可能悬挂的其他东西.