# no-fallthrough

不允许 case 语句的失败

配置文件中的 "extends": "eslint:recommended" 属性启用了该规则

JavaScript 中的 switch 语句是该语言中更容易出错的结构之一,这部分归功于 "fall through" 从一个 case 到另一个的能力。例如:

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

    case 2:
        doSomethingElse();
}

在此示例中,如果 foo1,则执行将流经这两种情况,因为第一种情况会一直到第二种情况。您可以通过使用 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();
    }
}

在此示例中,对于预期行为没有混淆。很明显,第一种情况是要落入第二种情况的。

# 规则详情

该规则旨在消除一个案例无意中的失败。因此,它会标记任何未由注释标记的失败场景。

此规则的错误代码示例:

/*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:
        doSomething();
        // falls through

    case 2:
        doSomething();
}

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

    case 2: {
        doSomethingElse();
    }
}

请注意,这些示例中的最后一个 case 语句不会导致警告,因为没有任何内容可陷入。

# 选项

此规则有一个对象选项:

  • 将 commentPattern 选项设置为正则表达式字符串以更改测试以测试有意的失败注释。

  • 将 allowEmptyCase 选项设置为 true 以允许空箱,而不管布局如何。默认情况下,仅当空 case 和下一个 case 位于同一行或连续行时,此规则才不需要空 case 后的 fallthrough 注释。

# 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();
}

# 何时不使用

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

Last Updated: 5/13/2023, 8:55:38 PM