我曾经听说在JavaScript中将花括号放在单行语句中可能有害。我不记得这个推理了,谷歌搜索并没有太大帮助。
是否有什么使将JavaScript中的所有语句括在大括号中的好主意呢?
我问,因为每个人似乎都这样做。
我曾经听说在JavaScript中将花括号放在单行语句中可能有害。我不记得这个推理了,谷歌搜索并没有太大帮助。
是否有什么使将JavaScript中的所有语句括在大括号中的好主意呢?
我问,因为每个人似乎都这样做。
Answers:
但是推荐。如果您要扩展该语句,则将需要它们。
这是完全有效的
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!")
}
有一个可读性方面-当您具有复合语句时,它会变得非常混乱。缩进有帮助,但对编译器/解释器没有任何意义。
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);
。现在很清楚!
这个问题只问一行。但是,提供的许多示例说明了不保留基于多行语句的花括号的原因。如果您更喜欢这种编码样式,那么绝对不要在一行上使用方括号。
例如,问题询问是否可以:
if (condition) statement;
它不会询问是否可以:
if (condition)
statement;
我认为省略括号是可取的,因为它使代码在使用更少语法的情况下更具可读性。
我的编码风格是除非代码是块,否则不要使用方括号。并且永远不要在一行上使用多个语句(用分号分隔)。我发现这很容易阅读和清除,并且从来没有关于“ if”语句的范围界定问题。结果,在单个if条件语句上使用方括号将需要3行。像这样:
if (condition) {
statement;
}
最好使用一行if语句,因为它使用较少的垂直空间并且代码更紧凑。
我不会强迫其他人使用此方法,但是它对我有用,并且我不能完全不同意所提供的有关省略括号如何导致编码/范围错误的示例。
/*eslint curly: ["error", "multi"]*/
从技术上讲不是,但是绝对是肯定的!!!
忘了“这是个人喜好”,“代码将正常运行”,“对我来说一直很好”,“更具可读性” 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:奖励积分归功于谁注意到了上面示例中的错误。
没有可维护性问题!
你们所有人的问题是,您到处都放置了分号。您不需要大括号就可以使用多个语句。如果要添加语句,请使用逗号。
if (a > 1)
alert("foo"),
alert("bar"),
alert("lorem"),
alert("ipsum");
else
alert("blah");
这是将有效运行的有效代码!
if
,else
和alert
不If
,Else
和Alert
?
除了@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;
}
但也许这里的错误更容易发现(?)
这就是为什么推荐
假设我写
if(someVal)
alert("True");
然后下一位开发人员来说:“哦,我需要做其他事情”,所以他们写了
if(someVal)
alert("True");
alert("AlsoTrue");
现在您可以看到,“ AlsoTrue”将始终为真,因为第一个开发人员没有使用花括号。
我目前正在开发一个缩小器。即使是现在,我还是通过两个巨大的脚本对其进行检查。我通过实验发现:如果花括号不包含';','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上测试。
javascript中有很多问题。看看的JavaScript架构师道格拉斯Crockford的谈论它的,如果声明似乎要被罚款,但返回的语句可能会引入问题。
return
{
ok:false;
}
//silent error (return undefined)
return{
ok:true;
}
//works well in javascript
语句的起始缩进级别应等于其上方的大括号数量。(不包括带引号或注释的花括号或预处理程序指令中的花括号)
否则,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
}
有时似乎需要它们!我本人不敢相信,但昨天在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;
很难找到。
我只想指出,您也可以将花括号放在其他位置。正如约翰·雷西格(John Resig)的本文所见。
if(2 == 1){
if(1 == 2){
console.log("We will never get here")
}
} else
console.log("We will get here")