虽然我意识到每种语言都有自己的缩进惯例,但我不禁对最近发现的东西感到恼火。请考虑PHP手册中的代码:
switch ($i) {
case "apple":
echo "i is apple";
break;
case "bar":
echo "i is bar";
break;
case "cake":
echo "i is cake";
break;
}
请注意,每个案例都是从switch语句缩进的。这是有道理的,因为代码更容易阅读,并且块的主体包含在其中的一个层次。
但是,当我在JSLint中测试等效的JavaScript switch语句时:
switch (i) {
case "apple":
alert("i is apple");
break;
case "bar":
alert("i is bar");
break;
case "cake":
alert("i is cake");
break;
}
...它显示一个错误,告诉我它应该显示为:
switch (i) {
case "apple":
alert("i is apple");
break;
case "bar":
alert("i is bar");
break;
case "cake":
alert("i is cake");
break;
}
这似乎违反直觉,因为现在每个案例都与交换机块本身内联。我无法想象为什么这会被认为更好,更不用说触发错误了。
JSLint是错误的,还是仅仅遵循约定?如果后者是真的,为什么惯例不能缩小以澄清?
答案 0 :(得分:6)
这是你的代码。格式化你想要的方式。使用jsLint,但如果您不同意其建议可以改进您的代码,请不要实现它们。 jsLint伤害了你的感情。
答案 1 :(得分:4)
在克罗克福德的书中,他指出街区不会引入新范围。 “JSLint期望具有函数的块,if,switch,while,for,do和try语句以及其他任何地方。”
还有那个
if (condition){
statements;
}
推荐的做块的方法;因为它“更有弹性”。我非常怀疑它的结构是错误的。
答案 2 :(得分:2)
只要您的缩进可以在逻辑上合理,您应该以您喜欢的样式缩进。如果JSLint真的抱怨这个,那么它就过于迂腐了。
答案 3 :(得分:1)
虽然格式很重要,但最终还是格式化。按你喜欢的方式做。您选择的特定风格是个人选择,许多风格可以“很好”。但是,任何“好的”格式化样式必须保持一致 - 选择您喜欢的规则并坚持使用。
对我来说,如果辩论如何放置{与前面的代码在同一条线上,或者在else
周围“拥抱大括号”这样的事情,这很有趣。我认为只有共产党人才能{与if
陈述在同一条线上。 :)
答案 4 :(得分:0)
这只是JS的惯例(因为JSLint定义了约定)。就个人而言,我认为PHP在这里是错误的(如果手册遵循任何类型的约定,dunno,我知道标准库没有)。我更喜欢JS风格,因为如果你在几个嵌套块中它会变得非常讨厌。例如(PHP代码):
class Foo{
function Bar($arr) {
foreach($arr as $item) {
switch ($item) {
case "foo":
// Do something
break;
// You get the idea
最终,你的选择。我不会将PHP手册用作样式指南;如果你不能为不同的语言使用不同的样式,请使用定义良好的JS样式。
答案 5 :(得分:0)
解释时,JavaScript和PHP会解析额外的空格,因此您可以根据需要使代码变得丑陋。我个人更喜欢在我的switch语句中添加额外的花括号,这样我就不会错过直接错误:
switch ($someVar)
{
case 'value':
{
//your code here
} break;
case 'something':
{
//more code here
}
case 'something else':
{
//some more code here
} break;
default:
{
//default code here
} break;
}
扫描结束括号中的代码可以让我检查是否添加了正确的break语句。您可以看到'something'
案例缺少中断语句(可能是故意的,可能是错误的)。
有些人会不同意这种格式,但这正是我所得到的。格式并不重要。解析器非常宽容。找一些适合你的东西并坚持下去。
答案 6 :(得分:0)
这是他的Java背景泄漏。 JSLint方式模仿official Java conventions for switch case。我更喜欢你的第一个例子,但我正在学习容忍JSLint方式。
答案 7 :(得分:0)
我也发现这非常令人困惑,并在http://javascript.crockford.com/code.html
中找到道格拉斯克罗克福德的 JavaScript编程语言代码约定的原因子句(case,catch,default,else,finally)不是语句和 所以不应该像语句那样缩进。