eslint/no-fallthrough 死板的
它做了什么
禁止 case
语句的直通
该规则旨在消除一个 case 无意中直通到另一个 case 的现象。因此,它标记了任何未由注释标记的直通场景。
为什么这样做不好?
JavaScript 中的 switch 语句是该语言中更易出错的结构之一,部分原因是可以从一个 case “直通”到下一个 case。例如
js
switch (foo) {
case 1:
doSomething();
case 2:
doSomethingElse();
}
在此示例中,如果 foo
为 1
,则执行将流经两个 case,因为第一个 case 直通到第二个 case。你可以使用 break
来防止这种情况发生,如下例所示
js
switch (foo) {
case 1:
doSomething();
break;
case 2:
doSomethingElse();
}
当你不想要直通时,该方法运行良好,但如果直通是有意的,那么就无法在语言中指明这一点。一个最佳做法被认为是始终使用与 `/falls?\s?through/i`` 正则表达式相匹配但不是指令的注释表示直通是有意的
js
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。
示例
此规则不正确的代码示例
js
/*oxlint no-fallthrough: "error"*/
switch (foo) {
case 1:
doSomething();
case 2:
doSomething();
}
此规则正确的代码示例
js
/*oxlint 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 语句不会导致警告,因为没有可以直通的对象。