版本

no-fallthrough

禁止 case 语句贯穿

推荐

配置文件中使用来自 @eslint/jsrecommended 配置将启用此规则

JavaScript 中的 switch 语句是该语言中更容易出错的结构之一,部分原因在于它能够从一个 case “贯穿”到下一个。例如

switch(foo) {
    case 1:
        doSomething();

    case 2:
        doSomethingElse();
}

在此示例中,如果 foo1,则执行将流经这两个 case,因为第一个贯穿到第二个。您可以通过使用 break 来防止这种情况,例如以下示例

switch(foo) {
    case 1:
        doSomething();
        break;

    case 2:
        doSomethingElse();
}

当您不希望贯穿时,这很好用,但是如果贯穿是故意的,则语言中没有办法表示这一点。最佳实践是始终使用与 /falls?\s?through/i 正则表达式匹配但不是指令的注释来指示何时贯穿是故意的

switch(foo) {
    case 1:
        doSomething();
        // falls through

    case 2:
        doSomethingElse();
}

switch(foo) {
    case 1:
        doSomething();
        // fall through

    case 2:
        doSomethingElse();
}

switch(foo) {
    case 1:
        doSomething();
        // fallsthrough

    case 2:
        doSomethingElse();
}

switch(foo) {
    case 1: {
        doSomething();
        // falls through
    }

    case 2: {
        doSomethingElse();
    }
}

在此示例中,对预期行为没有混淆。很明显,第一个 case 旨在贯穿到第二个 case。

规则详情

此规则旨在消除一个 case 到另一个 case 的意外贯穿。因此,它会标记任何未被注释标记的贯穿场景。

此规则的错误代码示例

在游乐场中打开
/*eslint no-fallthrough: "error"*/

switch(foo) {
    case 1:
        doSomething();

    case 2:
        doSomething();
}

此规则的正确代码示例

在游乐场中打开
/*eslint no-fallthrough: "error"*/

switch(foo) {
    case 1:
        doSomething();
        break;

    case 2:
        doSomething();
}

function bar(foo) {
    switch(foo) {
        case 1:
            doSomething();
            return;

        case 2:
            doSomething();
    }
}

switch(foo) {
    case 1:
        doSomething();
        throw new Error("Boo!");

    case 2:
        doSomething();
}

switch(foo) {
    case 1:
    case 2:
        doSomething();
}

switch(foo) {
    case 1: case 2:
        doSomething();
}

switch(foo) {
    case 1:
        doSomething();
        // falls through

    case 2:
        doSomething();
}

switch(foo) {
    case 1: {
        doSomething();
        // falls through
    }

    case 2: {
        doSomethingElse();
    }
}

请注意,这些示例中的最后一个 case 语句不会导致警告,因为没有内容可以贯穿到其中。

选项

此规则有一个对象选项

  • commentPattern 选项设置为正则表达式字符串以更改对有意贯穿注释的测试。如果贯穿注释与指令匹配,则该指令优先于 commentPattern

  • allowEmptyCase 选项设置为 true 以允许空 case,无论布局如何。默认情况下,此规则仅在空 case 和下一个 case 在同一行或连续行上时才不需要在空 case 后添加贯穿注释。

  • reportUnusedFallthroughComment 选项设置为 true 以禁止在 case 由于无法访问而无法贯穿时出现贯穿注释。这主要旨在帮助避免由于重构而导致的误导性注释。

commentPattern

{ "commentPattern": "break[\\s\\w]*omitted" } 选项的正确代码示例

在游乐场中打开
/*eslint no-fallthrough: ["error", { "commentPattern": "break[\\s\\w]*omitted" }]*/

switch(foo) {
    case 1:
        doSomething();
        // break omitted

    case 2:
        doSomething();
}

switch(foo) {
    case 1:
        doSomething();
        // caution: break is omitted intentionally

    default:
        doSomething();
}

allowEmptyCase

{ "allowEmptyCase": true } 选项的正确代码示例

在游乐场中打开
/* eslint no-fallthrough: ["error", { "allowEmptyCase": true }] */

switch(foo){
    case 1:

    case 2: doSomething();
}

switch(foo){
    case 1:
    /*
    Put a message here 
    */
    case 2: doSomething();
}

reportUnusedFallthroughComment

{ "reportUnusedFallthroughComment": true } 选项的错误代码示例

在游乐场中打开
/* eslint no-fallthrough: ["error", { "reportUnusedFallthroughComment": true }] */

switch(foo){
    case 1:
        doSomething();
        break;
    // falls through
    case 2: doSomething();
}

function f() {
    switch(foo){
        case 1:
            if (a) {
                throw new Error();
            } else if (b) {
                break;
            } else {
                return;
            }
        // falls through
        case 2:
            break;
    }
}

{ "reportUnusedFallthroughComment": true } 选项的正确代码示例

在游乐场中打开
/* eslint no-fallthrough: ["error", { "reportUnusedFallthroughComment": true }] */

switch(foo){
    case 1:
        doSomething();
        break;
    // just a comment
    case 2: doSomething();
}

何时不使用它

如果您不想强制每个 case 语句都以 throwreturnbreak 或注释结尾,则可以安全地关闭此规则。

版本

此规则在 ESLint v0.0.7 中引入。

资源

更改语言