问题 PHP与JavaScript切换缩进


虽然我意识到每种语言都有自己的缩进惯例,但我不禁对最近发现的东西感到恼火。请考虑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是错误的,还是仅仅遵循惯例?如果后者是真的,为什么公约不能缩小以澄清?


2157
2018-01-21 16:36


起源

JSLint实际上抱怨这种东西? -dies- - BoltClock♦
JS和PHP不是Python,使用你喜欢的缩进。 - Shikiryu
我会用 if (["apple","bar","cake"].indexOf(i) != -1) alert("i is a "+i); ;) - Gumbo
用多态替换条件 它不再是一个问题。 - Gordon
我自己也遇到了这个问题,并想知道发生了什么。如果,如上所述,开关被算作块,那么在我看来他搞砸了:D - Rafe


答案:


这是你的代码。格式化你想要的方式。使用jsLint,但如果您不同意其建议可以改进您的代码,请不要实现它们。 jsLint伤害了你的感情。


6
2018-01-21 16:39



究竟。 Crockford不是一些JS神,你必须遵守它的规则,虽然我很确定有一些复选框你可以检查/取消选中没有严格的空白警告/错误。 - meder omuraliev
我也同意这一点,但在这种情况下,我的感受并没有因为他们生气而受到伤害。我绝不会认为这是一个“错误”。此外,没有一个选项似乎压制它。这是一个问题的原因是因为该工具发现了许多潜在的问题(这不是其中之一),并且有一堆非错误的“错误”使得很难看到有效问题。 - claviska


在Crockford的书中,他指出块不会引入新的范围。 “JSLint期望具有函数的块,if,switch,while,for,do和try语句,以及其他任何地方。”

还有那个

if (condition){
    statements; 
}

是推荐的做块的方法;因为它“更有弹性”。我非常怀疑它的结构是错误的。


4
2018-01-21 16:53





只要您的缩进可以在逻辑上合理,您应该以您喜欢的样式缩进。如果JSLint真的抱怨这个,那么它就过于迂腐了。


2
2018-01-21 16:41



我同意。 JSLint是一个很棒的工具,但考虑到缩进首选项,“错误”似乎有点挑剔,特别是当结果代码不太明确时。 - claviska
实际上 不 一个很棒的工具。对于那些没有不同的东西(仅限风格,不是错误),它过于迂腐;然而,事情 将 导致错误(即某种类型的全局泄漏),它只是忽略。 JSLint是蛇油。 - Wil Moore III


虽然格式化很重要,但最终它是您的格式。按你喜欢的方式做。您选择的特殊风格是个人选择,许多风格可以“很好”。但是,任何“好的”格式化样式必须一致 - 选择您喜欢的规则和 坚持下去

对我来说,如何辩论如何放置{与前面的代码在同一条线上,或者围绕着一个“拥抱花括号”这样的事情,这很有趣 else。我认为只有共产主义者才能和他们一样{在同一条线上 if 声明。 :)


1
2018-01-21 16:48



猜猜我是共产主义者:P同样,问题在于触发错误的错误使得很难看到可能有效的错误。 - claviska
只要你是一个稳定的对手,你就可以了。任何说服力的格式都不一致,这并不酷。 - Surreal Dreams
对我来说够公平:) - claviska


这只是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样式。


0
2018-01-21 16:44



如果您的水平空间有限,只需将标签设置为2个空格即可。 - erjiang
你忘了if(is_array($ arr))如果你想要获得愚蠢的缩进水平:) - GordonM
@Gordon现在开枪了 - Rafe Kettler


额外的空格在解释时会用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'case缺少一个break语句(也许是故意的,也许是一个错误)。

有些人不同意这种格式,但这正是我所得到的。格式并不重要。解析器非常宽容。找到适合你的东西并坚持下去。


0
2018-01-21 16:53





这是他的Java背景泄露。 JSLint方式模仿了 切换案例的官方Java约定。我更喜欢你的第一个例子,但我正在学习容忍JSLint方式。


0
2018-05-29 18:28





我也发现这很令人困惑,并在道格拉斯克罗克福德找到了这个理由 JavaScript编程语言的代码约定 在 http://javascript.crockford.com/code.html

子句(case,catch,default,else,finally)不是语句和   所以不应该像语句那样缩进。


0
2017-09-30 20:26