# no-dupe-else-if
禁止 if-else-if 链中的重复条件
配置文件中的 "extends": "eslint:recommended" 属性启用了该规则
if-else-if
链通常用于根据特定条件只执行几个可能分支中的一个分支(或最多一个分支)的情况。
if (a) {
foo();
} else if (b) {
bar();
} else if (c) {
baz();
}
同一链中的两个相同的测试条件几乎总是代码中的错误。除非表达式中有副作用,否则重复项的 true
或 false
值将与链中较早的相同表达式相同,这意味着它的分支永远不会执行。
if (a) {
foo();
} else if (b) {
bar();
} else if (b) {
baz();
}
在上面的例子中,baz()
永远不能执行。显然,baz()
只能在 b
评估为 true
时执行,但在这种情况下,bar()
将被执行,因为它在链中更早。
# 规则详情
此规则不允许在同一 if-else-if
链中出现重复条件。
此规则的错误代码示例:
/*eslint no-dupe-else-if: "error"*/
if (isSomething(x)) {
foo();
} else if (isSomething(x)) {
bar();
}
if (a) {
foo();
} else if (b) {
bar();
} else if (c && d) {
baz();
} else if (c && d) {
quux();
} else {
quuux();
}
if (n === 1) {
foo();
} else if (n === 2) {
bar();
} else if (n === 3) {
baz();
} else if (n === 2) {
quux();
} else if (n === 5) {
quuux();
}
此规则的正确代码示例:
/*eslint no-dupe-else-if: "error"*/
if (isSomething(x)) {
foo();
} else if (isSomethingElse(x)) {
bar();
}
if (a) {
foo();
} else if (b) {
bar();
} else if (c && d) {
baz();
} else if (c && e) {
quux();
} else {
quuux();
}
if (n === 1) {
foo();
} else if (n === 2) {
bar();
} else if (n === 3) {
baz();
} else if (n === 4) {
quux();
} else if (n === 5) {
quuux();
}
此规则还可以检测某些条件不相同但由于 ||
和 &&
运算符的逻辑而导致分支永远无法执行的情况。
此规则的其他错误代码示例:
/*eslint no-dupe-else-if: "error"*/
if (a || b) {
foo();
} else if (a) {
bar();
}
if (a) {
foo();
} else if (b) {
bar();
} else if (a || b) {
baz();
}
if (a) {
foo();
} else if (a && b) {
bar();
}
if (a && b) {
foo();
} else if (a && b && c) {
bar();
}
if (a || b) {
foo();
} else if (b && c) {
bar();
}
if (a) {
foo();
} else if (b && c) {
bar();
} else if (d && (c && e && b || a)) {
baz();
}
请注意,此规则不会将链中的条件与语句内部的条件进行比较,并且在以下情况下不会发出警告:
if (a) {
if (a) {
foo();
}
}
if (a) {
foo();
} else {
if (a) {
bar();
}
}
# 何时不使用
在极少数情况下,您在同一链中确实需要相同的测试条件,这必然意味着链中的表达式会导致并依赖副作用,您将不得不关闭此规则。