no-mixed-operators
禁止混合使用二元运算符
此规则已于 ESLint v8.53.0 中**弃用**。请在相应规则中使用@stylistic/eslint-plugin-js
。
通过括号括起复杂的表达式可以阐明开发者的意图,从而使代码更易于阅读。此规则会在表达式中连续使用不同的运算符且没有括号时发出警告。
var foo = a && b || c || d; /*BAD: Unexpected mix of '&&' and '||'.*/
var foo = (a && b) || c || d; /*GOOD*/
var foo = a && (b || c || d); /*GOOD*/
注意:预期此规则对每对混合运算符发出一个错误。因此,对于使用的每两个连续的混合运算符,都会显示一个不同的错误,指明违反规则的特定运算符的使用位置。
var foo = a && b || c || d;
将生成
1:13 Unexpected mix of '&&' and '||'. (no-mixed-operators)
1:18 Unexpected mix of '&&' and '||'. (no-mixed-operators)
规则详情
此规则检查BinaryExpression
、LogicalExpression
和ConditionalExpression
。
此规则可能与no-extra-parens规则冲突。如果您同时使用此规则和no-extra-parens规则,则需要使用no-extra-parens规则的nestedBinaryExpressions
选项。
此规则的错误代码示例
/*eslint no-mixed-operators: "error"*/
var foo = a b < 0 c > 0 || d + 1 === 0;
var foo = a b c;
此规则的正确代码示例
/*eslint no-mixed-operators: "error"*/
var foo = a || b || c;
var foo = a && b && c;
var foo = (a && b < 0) || c > 0 || d + 1 === 0;
var foo = a && (b < 0 || c > 0 || d + 1 === 0);
var foo = a + (b * c);
var foo = (a + b) * c;
选项
{
"no-mixed-operators": [
"error",
{
"groups": [
["+", "-", "*", "/", "%", "**"],
["&", "|", "^", "~", "<<", ">>", ">>>"],
["==", "!=", "===", "!==", ">", ">=", "<", "<="],
["&&", "||"],
["in", "instanceof"]
],
"allowSamePrecedence": true
}
]
}
此规则有 2 个选项。
-
groups
(string[][]
) - 指定要检查的运算符组。groups
选项是一个组列表,而一个组是一个二元运算符列表。默认运算符组定义为算术运算符、按位运算符、比较运算符、逻辑运算符和关系运算符。注意:三元运算符(?:)可以是任何组的一部分,并且默认情况下允许与其他运算符混合使用。 -
allowSamePrecedence
(boolean
) - 指定是否允许混合使用优先级相同的运算符。默认为true
。
groups
以下运算符可以在groups
选项中使用
- 算术运算符:
"+"
、"-"
、"*"
、"/"
、"%"
、"**"
- 按位运算符:
"&"
、"|"
、"^"
、"~"
、"<<"
、">>"
、">>>"
- 比较运算符:
"=="
、"!="
、"==="
、"!=="
、">"
、">="
、"<"
、"<="
- 逻辑运算符:
"&&"
、"||"
- 空值合并运算符:
"??"
- 关系运算符:
"in"
、"instanceof"
- 三元运算符:
?:
现在,考虑以下组配置:{"groups": [["&", "|", "^", "~", "<<", ">>", ">>>"], ["&&", "||"]]}
。此配置中指定了 2 个组:按位运算符和逻辑运算符。此规则仅检查运算符是否属于同一组。在这种情况下,此规则检查按位运算符和逻辑运算符是否混合使用,但忽略所有其他运算符。
使用{"groups": [["&", "|", "^", "~", "<<", ">>", ">>>"], ["&&", "||"]]}
选项的此规则的错误代码示例
/*eslint no-mixed-operators: ["error", {"groups": [["&", "|", "^", "~", "<<", ">>", ">>>"], ["&&", "||"]]}]*/
var foo = a b < 0 c > 0 || d + 1 === 0;
var foo = a b c;
/*eslint no-mixed-operators: ["error", {"groups": [["&&", "||", "?:"]]}]*/
var foo = a b c : d;
var bar = a b c : d;
var baz = a b : c d;
使用{"groups": [["&", "|", "^", "~", "<<", ">>", ">>>"], ["&&", "||"]]}
选项的此规则的正确代码示例
/*eslint no-mixed-operators: ["error", {"groups": [["&", "|", "^", "~", "<<", ">>", ">>>"], ["&&", "||"]]}]*/
var foo = a || b > 0 || c + 1 === 0;
var foo = a && b > 0 && c + 1 === 0;
var foo = (a && b < 0) || c > 0 || d + 1 === 0;
var foo = a && (b < 0 || c > 0 || d + 1 === 0);
var foo = (a & b) | c;
var foo = a & (b | c);
var foo = a + b * c;
var foo = a + (b * c);
var foo = (a + b) * c;
/*eslint no-mixed-operators: ["error", {"groups": [["&&", "||", "?:"]]}]*/
var foo = (a || b) ? c : d;
var foo = a || (b ? c : d);
var bar = a ? (b || c) : d;
var baz = a ? b : (c || d);
var baz = (a ? b : c) || d;
allowSamePrecedence
使用{"allowSamePrecedence": true}
选项的此规则的正确代码示例
/*eslint no-mixed-operators: ["error", {"allowSamePrecedence": true}]*/
// + and - have the same precedence.
var foo = a + b - c;
使用{"allowSamePrecedence": false}
选项的此规则的错误代码示例
/*eslint no-mixed-operators: ["error", {"allowSamePrecedence": false}]*/
// + and - have the same precedence.
var foo = a b c;
使用{"allowSamePrecedence": false}
选项的此规则的正确代码示例
/*eslint no-mixed-operators: ["error", {"allowSamePrecedence": false}]*/
// + and - have the same precedence.
var foo = (a + b) - c;
何时不使用它
如果您不想收到有关混合运算符的通知,则可以安全地禁用此规则。
相关规则
版本
此规则是在 ESLint v2.12.0 中引入的。