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

IT技术 javascript
2021-01-22 12:40:47

我曾经听说在单行语句中保留大括号在 JavaScript 中可能是有害的。我不记得推理了,谷歌搜索也没有多大帮助。

在 JavaScript 中,将所有语句括在花括号内是否是一个好主意?

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

6个回答

但他们被推荐。如果您扩展该语句,您将需要它们。

这是完全有效的

if (cond) 
    alert("Condition met!")
else
    alert("Condition not met!")

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

在所有带有支撑的 C 语法风格语言中都遵循同样的做法。C、C++、Java,甚至PHP都支持不带大括号的一行语句。您必须意识到您只保存了两个字符,而对于某些人的支撑样式,您甚至没有保存一行。我更喜欢完整的支撑样式(如下所示),因此它往往会更长一些。由于您具有非常清晰的代码可读性,因此可以很好地进行权衡。

if (cond) 
{
    alert("Condition met!")
}
else
{
    alert("Condition not met!")
}
我的个人经验表明,在团队合作时,不放置护腕会导致大麻烦。
2021-03-15 12:40:47
始终使用大括号 {} 是一个好习惯。正如@Arx 所说,如果您将它们排除在外,则出错的空间会更大。苹果甚至在 iOS 的 SSL/TLS 中也有一个错误,因为他们没有使用大括号
2021-03-26 12:40:47
@柯克:道格拉斯·克罗克福德推荐它。我同意这是一个主观的个人决定,但在团队中工作时,简单地输入括号会更容易。
2021-03-29 12:40:47
@Josh,哦,好吧,克罗克福德说的。那一定是最后一句话。;)(开个玩笑)问题是这一点的主观性涵盖了所有类似 C 的语言,并且可以在整个过程中找到强烈的意见(对于这两个位置)。
2021-04-01 12:40:47
+1,信息丰富的答案。但就我个人而言,我从来没有发现做这个“推荐”的事情有用。我从来没有编码过 python,所以我不只是插入东西并期望缩进很重要。如果我添加一个语句,我也会添加大括号。总是。不记得它咬了我一次。不是在 C 中,不是在 C# 中,不是在 JavaScript 中。
2021-04-08 12:40:47

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

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

然后是可扩展性方面:

//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
} 

想法是,如果您总是有括号,那么您就知道在该块中插入其他语句。

这就是为什么我们应该始终将它用作单行:if (a===true) alert(a);. 现在很清楚了!
2021-03-15 12:40:47
使用 curl-left-bracket 和 curly-right-bracket 使条件变得清晰。对于我们中间的梦想家,也被称为左右飞鸟。
2021-04-08 12:40:47
始终使用自动缩进,人
2021-04-09 12:40:47

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

例如,问题询问这是否可以:

 if (condition) statement;

它不会询问这是否可以:

 if (condition)
   statement;

我认为去掉括号更可取,因为它使代码更具可读性,而且多余的语法更少。

我的编码风格是永远不要使用括号,除非代码是一个块。并且永远不要在一行中使用多个语句(用分号分隔)。我发现这很容易阅读和清晰,而且从来没有关于“if”语句的范围问题。因此,在单个 if 条件语句上使用括号需要 3 行。像这样:

 if (condition) {
   statement;
 }

最好使用一行 if 语句,因为它使用较少的垂直空间并且代码更紧凑。

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

为每个括号添加的 2 行用于包围您的单行语句与可能由(即使是非常细心的开发人员)维护您的代码可能造成的潜在损害相比,成本并不高。您自己可以成为具有神话般技能的优秀开发人员,但您不能假设您的同事是。亲吻,用上下文包装事物并使其对其他人尽可能容易,否则您最终会陷入困境。
2021-03-15 12:40:47
我一直觉得一个应该总是包括括号......但我现在重新考虑它。身边airbnb风格指南!
2021-03-16 12:40:47
然而,您忘记了大多数代码格式化程序将其更改为 2 行格式,并且您又回到了有问题的代码。垂直空间的论点很愚蠢。可读性总是胜出,今天的屏幕是巨大的。
2021-03-16 12:40:47
@senderle 控制这个的 eslint 规则可以在这里找到:eslint.org/docs/rules/curly#multi /*eslint curly: ["error", "multi"]*/
2021-04-02 12:40:47

技术上没有,但非常推荐!!!

忘记“这是个人喜好”,“代码运行良好”,“它对我来说一直很好”,“它更具可读性” yada yada BS。如果您犯了错误并且相信我,这很容易导致非常严重的问题,并且在编码时很容易犯错误(不相信?,请查看著名的Apple go to fail 错误)。

论点:“这是个人喜好”

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

参数:“代码会运行得很好”

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

论点:“它对我来说一直很好”

在我的职业生涯中,我见过很多因为这个问题而产生的错误。你可能不记得你有多少次注释掉'DoSomething()'并为为什么'SomethingElse()'被调用感到困惑

if (condition) 
    DoSomething();
SomethingElse();

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

if (condition)
  DoSomething();
  SomethingMore();

这是我遇到的一个现实生活中的例子。有人想关闭所有日志记录,所以他们运行 find&replace "console.log"=> //"console.log"

if (condition) 
   console.log("something");
SomethingElse();

看到问题了吗?

即使你认为,“这些都是微不足道的,我永远不会那样做”;记住,总会有一个团队成员的编程能力比你差(希望你不是团队中最差的!)

论点:“它更具可读性”

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

if (condition) 
    DoSomething();

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

if (a != null)
   if (condition) 
      DoSomething();
   else
      DoSomethingElse(); 
      DoSomethingMore();
else 
    if (b == null)
         alert("error b");
    else 
         alert("error a");

并将其与此进行比较:

 if (a != null) {
    if (condition) { 
       DoSomething();
    }
    else {
       DoSomethingElse();
       DoSomethingMore();
    }
 } else if (b == null) {
    alert("error b");
 } else {
    alert("error a");
 }

PS:奖励积分归于注意到上述示例中的错误的人。

通过您的示例,您的开发团队根本不知道如何编码,大括号对他们无济于事......
2021-03-19 12:40:47
那么明显的错误是 DoSomethingMore(); 但还有另一个错误。如果 a 为空且 b 为空,您只会得到“错误 b”,而永远不会得到“错误 a”。
2021-03-30 12:40:47
@rocketsarefast '如果 a 为空而 b 为空,你只会得到“错误 b”,你永远不会得到“错误 a”。' 这可能是需要的,当 a 为空时,您会收到“错误 a”,但 b 不是。也许 b 不为空更重要,这就是在 else 中添加嵌套 if 的原因。:-)
2021-04-02 12:40:47

不存在可维护性问题!

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

if (a > 1)
 alert("foo"),
 alert("bar"),
 alert("lorem"),
 alert("ipsum");
else
 alert("blah");

这是将像您期望的那样运行的有效代码!

我更喜欢“海明威式”的方法:非常干净。而如果没有之间的空间if(if(true) doSomething();
2021-03-16 12:40:47
哇,我不知道这个,谢谢你告诉我!似乎大多数人都忽略了这个重要的细节。
2021-03-18 12:40:47
虽然这在 JavaScript 中有效,但我无法理解为什么您会想要这样做。我敢于猜测大多数开发人员都没有意识到这一点(在阅读本文之前我自己也包括在内),我怀疑这会很快成为开发人员之间的可维护性问题。有时候,最聪明的方法并不是最好的。
2021-03-19 12:40:47
你不是说if, elseandalert而不是If, ElseandAlert吗?
2021-03-31 12:40:47
这太可怕了。如果有人增加了一个声明,忘记把分号变成一个逗号在现在第二到块的最后一条语句,你有可能是一个错误真的很难发现,因为逗号和分号线看的方式结束过相似的。
2021-04-07 12:40:47