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


161

我曾经听说在JavaScript中将花括号放在单行语句中可能有害。我不记得这个推理了,谷歌搜索并没有太大帮助。

是否有什么使将JavaScript中的所有语句括在大括号中的好主意呢?

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


5
注意:即使您在一行上有多个语句,也只有第一个语句才具有范围,因此它不是“一行语句”,而是单个语句
Kris Ivanov

1
您可能会想到此答案中
Blorgbeard在

@Blorgbeard:不,我刚才回答了这个答案。

嗯,我明白了。没关系,然后:)
Blorgbeard在

Answers:


203

没有

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

这是完全有效的

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!")
}

28
+1,翔实的答案。不过,就我个人而言,我从未发现执行此“推荐”的事情很有用。我从来没有编码过python,所以我不只是插入东西而且期望缩进很重要。如果添加语句,则还添加大括号。总是。记不清它一次咬我。不在C中,不在C#中,不在JavaScript中。
雅各布

16
@柯克:道格拉斯·克罗克福德推荐。我同意这是一个主观的个人决定,但是在小组中工作时,只需键入大括号就容易了。
乔什K

10
@Josh,哦,好吧,Crockford说了。那一定是硬道理。;)(开个玩笑)问题在于,这一点的主观性遍及所有类似于C的语言,并且贯穿始终(对于两个职位)都可以找到强有力的意见。
柯克·沃尔

11
我的个人经验表明,在团队中工作时,不放置护腕会导致严重的受伤。
Sirs'Oct

4
始终使用大括号{}是一个好习惯。正如@Arx所说的,如果您将其遗漏,则还有更多的出错空间。苹果甚至在iOS的SSL / TLS中存在一个错误,因为它们未使用花括号
Keenan Lidral-Porter 2015年

94

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

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
} 

这种想法是,如果您始终有方括号,那么您知道在该块中插入其他语句。


4
这就是为什么我们应该始终将其用作单线:if (a===true) alert(a);。现在很清楚!
若奥·皮门特尔·费雷拉

1
使用左大括号和右大括号可以使条件清楚。对于我们中间的梦想家,也称为左右飞鸟。
HalfMens

61

这个问题只问一行。但是,提供的许多示例说明了不保留基于多行语句的花括号的原因。如果您更喜欢这种编码样式,那么绝对不要在一行上使用方括号。

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

 if (condition) statement;

它不会询问是否可以:

 if (condition)
   statement;

我认为省略括号是可取的,因为它使代码在使用更少语法的情况下更具可读性。

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

 if (condition) {
   statement;
 }

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

我不会强迫其他人使用此方法,但是它对我有用,并且我不能完全不同意所提供的有关省略括号如何导致编码/范围错误的示例。


1
我一直觉得一个人应该总是放括号...但是我现在正在重新考虑它。您身边airbnb风格指南!
senderle's

1
但是,您忘记了大多数代码格式化程序会将其更改为2行格式,而您又回到了有问题的代码。垂直空间的说法很愚蠢。可读性始终是胜利,当今的屏幕非常庞大。
金·

1
与(甚至非常谨慎的开发人员)维护您的代码可能造成的潜在损害相比,为每个括号添加两行以包围您的单行语句,这并不是一个大代价。您自己可以成为一位具有神话技巧的伟大开发人员,但您不能假设您的同事是。吻,将内容包装在上下文中,并使其尽可能地为他人所用,否则您最终会遇到麻烦。
Maciej Tokarz

@senderle可在此处找到控制该行为的eslint规则:eslint.org/docs/rules/curly#multi /*eslint curly: ["error", "multi"]*/
Silkfire

15

从技术上讲不是,但是绝对是肯定的!!!

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

论点:“这是个人喜好”

不它不是。除非您是一个单人团队,否则不会。大多数情况下,会有其他人阅读/修改您的代码。在任何认真的编码团队中,这都是推荐的方法,因此这不是“个人喜好”。

参数:“代码将正常运行”

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

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

在我的职业生涯中,我已经看到了许多由于此问题而产生的错误。您可能不记得您注释了多少次,'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:奖励积分归功于谁注意到了上面示例中的错误。


2
好吧,显而易见的错误是DoSomethingMore(); 但是,还有另一个错误。如果a为null,b为null,则只会得到“错误b”,而永远不会得到“错误a”。
rocketsarefast

以您的示例为例,您的开发团队根本不知道如何编码,大括号对他们没有帮助...
Carlos ABS

其中一些示例来自Apple开发人员团队
Caner

13

没有可维护性问题!

你们所有人的问题是,您到处都放置了分号。您不需要大括号就可以使用多个语句。如果要添加语句,请使用逗号。

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

这是将有效运行的有效代码!


2
难道你的意思是ifelsealertIfElseAlert
2012年

哇,我不知道,谢谢您通知我!似乎大多数人都忽略了这一重要细节。
Hendeca 2014年

13
尽管这在JavaScript中有效,但您为什么要这么做超出了我的范围。我正在做出一个猜测,即大多数开发人员都不知道这一点(在阅读本文之前已包括了我自己),我怀疑这样很快就会成为开发人员之间的可维护性问题。有时,最聪明的方法并不是最好的方法。
西蒙

14
这太可怕了。如果有人增加了一个声明,忘记把分号变成一个逗号在现在第二到块的最后一条语句,你有可能是一个错误真的很难发现,因为逗号和分号线看的方式结束过类似。
IngoBürk2015年

1
我更喜欢“海明威式”方法:非常干净。并且在if和之间没有空格(,例如if(true) doSomething();
victorf

8

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

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

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


7

除了@Josh K提到的原因(这也适用于Java,C等)之外,JavaScript中的一个特殊问题是自动分号插入。从Wikipedia示例:

return
a + b;

// Returns undefined. Treated as:
//   return;
//   a + b;

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

if (x)
   return
   a + b;

写真的不是更好

if (x) {
   return
   a + b;
}

但也许这里的错误更容易发现(?)


所有这些示例在我看来都是可怕的,除非作家是临时的并且按行支付或直到付清为止。
Cees Timmerman


4

有很多好的答案,所以我不再重复,除了在括号可以省略时说我的“规则”:在“返回”或“抛出”(例如)为唯一陈述的条件下。在这种情况下,流控制已经明确要终止:

由于终止了流量控制,即使是“坏情况”也可以快速识别(并解决)。此概念/结构“规则”也适用于多种语言。

if (x)
    return y;
    always();

当然,这也是为什么要使用短绒棉的原因。


3

这就是为什么推荐

假设我写

if(someVal)
    alert("True");

然后下一位开发人员来说:“哦,我需要做其他事情”,所以他们写了

if(someVal)
    alert("True");
    alert("AlsoTrue");

现在您可以看到,“ AlsoTrue”将始终为真,因为第一个开发人员没有使用花括号。


这是不正确的,您缺少“ else”:if(someVal)alert(“ True”); 否则alert(“ AlsoTrue”); 是正确的。我不会使用它,因为我更喜欢{},因为它可读性更好。
Gerrit B

1
??我没有其他声明。我是说没有花括号的情况下,如果有人添加新行,可能会导致错误。我想你不明白我的意思。
Amir Raminfar

我认为他的意思是第二行无论如何都会执行。不带括号的If语句只能执行1行。
PostCodeism

3

我目前正在开发一个缩小器。即使是现在,我还是通过两个巨大的脚本对其进行检查。我通过实验发现:如果花括号不包含';','return','for','if','else', 'while','do','function'。任意换行。

function a(b){if(c){d}else{e}} //ok  
function a(b){if(c)d;else e}   //ok

当然,如果没有在其他封闭括号后面加上分号,则需要用分号替换封闭括号。

函数不得以逗号结尾。

var a,b=function()c;  //ok *but not in Chrome
var b=function()c,a;  //error  

在Chrome和FF上测试。


2

总是发现

if(valid) return;

比我更容易

if(valid) {
  return;
}

也有条件的

(valid) ? ifTrue() : ifFalse();

更容易阅读(我的个人观点),而不是

if(valid) {
  ifTrue();
} else {
  ifFalse();
}

但我想这归结为编码风格


2

没有直接回答问题,但是下面是关于if条件在一行上的简短语法

例如:

var i=true;
if(i){
  dosomething();
}

可以这样写:

var i=true;
i && dosomething();


1

我发现此答案是在寻找类似的经历,因此我决定以我的经验来回答。

无括号的语句在大多数浏览器中都有效,但是,我测试了无括号的方法实际上在某些浏览器中不起作用。

自2018年2月26日起,此声明适用于Pale Moon,但不适用于Google Chrome。

function foo()
   return bar;

0

语句的起始缩进级别应等于其上方的大括号数量。(不包括带引号或注释的花括号或预处理程序指令中的花括号)

否则,K&R将是好的缩进样式。要修复其样式,建议将简短的if语句放在一行上。

if (foo) bar();    // I like this. It's also consistent with Python FWIW

代替

if (foo)
   bar();   // not so good

如果正在编写编辑器,则使它的自动格式按钮将条形与foo吸到同一行,如果您按回车键,则使它在条形周围插入花括号,如下所示:

if (foo) {
  bar();    // better
}

然后在if语句的主体内的bar上方或下方添加新语句很容易且一致

if (foo) {
  bar();    // consistent
  baz();    // easy to read and maintain
}

-1

有时似乎需要它们!我本人不敢相信,但昨天在Firebug会话(最近的Firefox 22.0)中,它发生在我身上

if (! my.condition.key)
    do something;

尽管my.condition.keytrue,还是执行了一些操作。添加括号:

if (! my.condition.var) {
    do something;
}

解决这个问题。有很多例子,显然没有括号就可以使用它,但是在这种情况下,肯定没有。

倾向于在一行上放置多个语句的人当然应该总是使用大括号,因为诸如此类的事情

if (condition)
    do something; do something else;

很难找到。


我很好奇在什么情况下缺少括号使if条件成立,您能记得还是给出一个真实的例子?
gitsitgo 2014年

条件表达式始终在语句之前求值。我也很好奇看到一个真实的例子,因为它代表了解释器中的错误。
分号

-1

我只想指出,您也可以将花括号放在其他位置。正如约翰·雷西格(John Resig)的本文所见。

if(2 == 1){
    if(1 == 2){
        console.log("We will never get here")
    }
} else 
    console.log("We will get here")

[Qt花括号样式] [1]在a的两侧都需要块else以匹配花括号的用法-此示例在else块上需要花括号才能通过代码审查。[1]:wiki.qt.io/Qt_Coding_Style#Braces
pixelgrease 2015年

为什么要下票?上面的陈述是100%准确的。
约翰斯顿

-1

有一种方法可以实现多行非大括号if语句..(哇,英语..),但这有点像泰迪熊:

if(true)
   funcName();
else
   return null;


function funcName(){
  //Do Stuff Here...
}

省略花括号时,不必有太多新行。上面的内容也可以写成两行: if (true) funcName()else return null
phobos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.