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

时间:2011-01-25 18:17:14

标签: javascript

我曾经听说过将花括号留在单行语句中可能会对JavaScript造成伤害。我不再记得推理了,谷歌搜索也没多大帮助。

在JavaScript中用花括号括起所有语句是否有任何好处?

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

21 个答案:

答案 0 :(得分:169)

但他们是推荐的。如果您要扩展声明,则需要它们。

这是完全有效的

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

答案 1 :(得分:88)

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

var a;
var b;
var c;

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

//Indenting is bad
if (a===true)
  alert(a); //On 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
} 

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

答案 2 :(得分:50)

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

例如,问题是否可以:

 if (condition) statement;

它不会问这是否可以:

 if (condition)
   statement;

我认为将括号括起来更可取,因为它使代码更具可读性,而且语法更少。

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

 if (condition) {
   statement;
 }

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

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

答案 3 :(得分:11)

没有可维护性问题!

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

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

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

答案 4 :(得分:11)

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

忘记“这是个人偏好”,“代码运行得很好”,“它一直对我很好”,“它更具可读性”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:在上面的示例中,谁注意到了这个错误。

答案 5 :(得分:7)

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

return
a + b;

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

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

if (x)
   return
   a + b;

并不是更好
if (x) {
   return
   a + b;
}

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

答案 6 :(得分:6)

这是一个风格问题,但花括号有助于防止可能的dangling else's

答案 7 :(得分:3)

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

这只取决于程序员的偏好和可读性。

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

答案 8 :(得分:2)

这就是推荐的原因

让我说我写

if(someVal)
    alert("True");

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

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

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

答案 9 :(得分:2)

有很多很好的答案,所以我不会重复,除了在括号可以省略时说我的“规则”:在“ return”或“ throw”(例如)作为条件的情况下仅声明。在这种情况下,流控制已经明确终止:

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

while (1) {
    char user_input[BUFSIZE];
    fgets(user_input, BUFSIZE, stdin);
    if (sscanf(user_input, "%d", node->val)) {
        ...
    } else if (user_input[0] == 'n' || user_input[0] == 'N') {
        break;
    }
}

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

答案 10 :(得分:1)

我正在制作一个缩小器。即使是现在我在两个巨大的脚本上检查它。实验上我发现: 你可以删除后面的花括号,if,else,while,function *如果花括号不包括';','return','for','if','else','while','做”,‘功能’。无休止的换行。

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上测试过。

答案 11 :(得分:1)

javascript中存在许多问题。看看JavaScript architect Douglas Crockford talking about it if 语句似乎没问题,但 return 语句可能会引发问题。

return
{
    ok:false;
}
//silent error (return undefined)

return{
    ok:true;
}
//works well in javascript

答案 12 :(得分:1)

我发现这个答案正在寻找类似的经历,所以我决定用我的经验回答它。

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

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

function foo()
   return bar;

答案 13 :(得分:0)

括号不是必需的.....但还是要添加^^

.....如果不需要,为什么要在if语句中添加括号?因为有可能引起混乱。如果您要与来自不同框架和语言的多人一起处理项目,那么明确表示可以减少人们误读彼此的代码而出现错误的可能性。编码足够困难,因为不会造成混淆。但是,如果您是唯一的开发人员,并且喜欢这种编码样式,那么从某种意义上说,它是完全有效的语法。

作为一种普遍的哲学:避免编写代码,但是如果必须编写代码,请使其清晰无误。

if (true){console.log("always runs");}

if (true) console.log("always runs too, but what is to be gained from the ambiguity?");
    console.log("this always runs even though it is indented, but would you expect it to?")

^ 免责声明:这是个人观点-观点可能会有所不同。请咨询您的CTO以获取个性化的编码建议。如果仍然出现头痛,请咨询医生。

答案 14 :(得分:0)

不,花括号不是必需的,但是,使用花括号语法的一个非常重要的原因是,如果没有花括号,则有多个调试器不会在if语句的行中停止。因此,可能很难知道if语句中的代码是否在不更改代码的情况下运行(某种记录/输出语句)。当使用逗号添加多行执行时,这尤其是一个问题。如果不添加特定的日志记录,可能很难查看实际运行的日志或特定问题的出处。我的建议是始终使用大括号。

答案 15 :(得分:0)

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

例如:

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

可以这样写:

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

答案 16 :(得分:0)

始终找到

if(valid) return;
我的眼睛比

更容易
if(valid) {
  return;
}

也是有条件的,例如

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

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

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

但我猜它归结为编码风格

答案 17 :(得分: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语句的正文中添加上面或下面的新语句是容易且一致的

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

答案 18 :(得分:0)

有一种方法可以实现多行非花括号如果语句..(哇英语怎么说..)但它有点儿了:

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


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

答案 19 :(得分:0)

我想要指出的是,您也可以将花括号从其他地方移开。如this article by John Resig's中所示。

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

答案 20 :(得分:0)

有时似乎需要它们!我自己也不敢相信,但昨天我在Firebug会议(最近的Firefox 22.0)中发现了

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

执行执行某些操作尽管 my.condition.key true 。添加大括号:

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

解决了这个问题。有大量的例子,它显然没有括号,但在这种情况下肯定没有。

那些倾向于在一行上放置多个语句的人当然应该始终使用大括号,当然,因为像

这样的事情
if (condition)
    do something; do something else;

很难找到。