【问题标题】:JSLint doesn't like default as first case in switchJSLint 不喜欢默认作为 switch 中的第一种情况
【发布时间】:2013-09-12 13:51:00
【问题描述】:

我正在使用 JSLint 使我的(工作)代码更简洁。

这是一个有用的工具,但它根本不喜欢这个:

//...
switch (process.argv.length) {
    default:

    case 9:
        LOG = process.argv[8];
    case 8:
        EMERGENCY = process.argv[7];
    //...
        break;
    case 1:
    case 0:
        emergency('Error');
        break;
}

JSLint 说:

Missing 'case'.
Expected '}' to match 'switch' and instead saw 'case'
Expected '9' at column 5, not column 10.
Expected ';' and instead saw ':'
Expected ':' at column 5, not column 11
Unexpected ':'
Stopping.

全部在“案例 9:”行

我将默认设置为第一,如果用户输入太多参数,则不会阻止应用程序。

我可以把它放在最后,把所有的传递都复制粘贴进去,但我不喜欢这个主意,或者把所有这些都放在嵌套的 if 中,但它会不可读。

有没有办法让 JSLint 接受这个?

编辑:

这里是处理旧版本中开关盒角色的代码(接受的参数较少:

if (process.argv.length>=3){
    DOWNLOAD_DIR=PATH+process.argv[2];
    if(process.argv.length>=4){
        DOWNLOAD_ADD=process.argv[3];
        if (process.argv.length>=5)
        {
            SMIL_ADD=process.argv[4];
            if (process.argv.length>=6)
            {
                UPDATE_H=parseInt(process.argv[5],10);
                if (process.argv.length>=7)
                {
                    UPDATE_M=parseInt(process.argv[6],10);
                }
            }
        }
    }
}

如您所见,该开关比嵌套的 if 更具可读性,即使它让我以不寻常的方式使用默认值。

【问题讨论】:

  • JSLint 不喜欢,我也不喜欢。带有失败案例的switch 语句是所有反模式之母。

标签: javascript node.js jslint


【解决方案1】:

您还需要在默认情况下使用break;

编辑:

对不起,我不太明白你的问题。首先,在您编辑的版本中,不需要嵌套每个 if 语句。此外,如果不满足这些条件,这些变量(例如,DOWNLOAD_DIR)等于什么?你不能在以下几行做点什么:

DOWNLOAD_DIR = (process.argv[2] !== undefined) ? PATH + process.argv[2] : '';
DOWNLOAD_ADD = (process.argv[3] !== undefined) ? process.argv[3] : '';
// etc, etc

那么你可以在最后添加:

LOG = (process.argv.length >= 9) ? process.argv[8] : '';

在你的情况下,听起来你想将那些空字符串设置为默认值,这意味着整个事情可以用非常少的代码完成,例如:

var DOWNLOAD_DIR = (process.argv[2] !== undefined) ? PATH + process.argv[2] : '/downloads';

【讨论】:

  • 目标是在这种情况下有默认的fall-through,我已经处理了 switch 结束时参数太少的错误。
  • 当我声明它们时,如果用户没有放置足够的配置,我会设置默认值。对于 DOWNLOAD_DIR 示例,它是 var DOWNLOAD_DIR = 'downloads/'。我正在尝试你的例子
  • 你的解决方案很完美,我还没有在 JSLint 上测试过,但它是可读的,不要对代码进行奇怪的使用,它甚至可以减轻我的代码
  • 顺便说一句,JSLint 确实喜欢这样写
猜你喜欢
  • 2015-03-17
  • 2011-11-21
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2023-01-03
  • 1970-01-01
相关资源
最近更新 更多