# no-unsafe-negation
禁止对关系运算符的左操作数求反
配置文件中的 "extends": "eslint:recommended" 属性启用了该规则
就像开发人员可能会在他们的意思是 -(a + b)
的负数时键入 -a + b
一样,当他们几乎可以肯定的意思是 !(key in object)
以测试某个键不在对象中时,他们可能会错误地键入 !key in object
。!obj instanceof Ctor
类似。
# 规则详情
此规则不允许对以下关系运算符的左操作数取反:
in 运算符
。instanceof 运算符
。
此规则的错误代码示例:
/*eslint no-unsafe-negation: "error"*/
if (!key in object) {
// operator precedence makes it equivalent to (!key) in object
// and type conversion makes it equivalent to (key ? "false" : "true") in object
}
if (!obj instanceof Ctor) {
// operator precedence makes it equivalent to (!obj) instanceof Ctor
// and it equivalent to always false since boolean values are not objects.
}
此规则的正确代码示例:
/*eslint no-unsafe-negation: "error"*/
if (!(key in object)) {
// key is not in object
}
if (!(obj instanceof Ctor)) {
// obj is not an instance of Ctor
}
# 异常
对于想要否定左操作数的极少数情况,此规则允许例外。如果整个否定明确地包含在括号中,则规则不会报告问题。
此规则的正确代码示例:
/*eslint no-unsafe-negation: "error"*/
if ((!foo) in object) {
// allowed, because the negation is explicitly wrapped in parentheses
// it is equivalent to (foo ? "false" : "true") in object
// this is allowed as an exception for rare situations when that is the intended meaning
}
if(("" + !foo) in object) {
// you can also make the intention more explicit, with type conversion
}
此规则的错误代码示例:
/*eslint no-unsafe-negation: "error"*/
if (!(foo) in object) {
// this is not an allowed exception
}
# 选项
此规则有一个对象选项:
"enforceForOrderingRelations": false
(默认)允许对排序关系运算符(<
、>
、<=
、>=
)的左侧取反"enforceForOrderingRelations": true
不允许对排序关系运算符的左侧求反
# enforceForOrderingRelations
将此选项设置为 true
时,还会针对以下情况额外强制执行该规则:
<
运算符。>
运算符。<=
运算符。>=
运算符。
目的是避免当真正的意图是 !(a < b)
时,诸如 ! a < b
(相当于 (a ? 0 : 1) < b
)之类的表达。
带有 { "enforceForOrderingRelations": true }
选项的此规则的其他错误代码示例:
/*eslint no-unsafe-negation: ["error", { "enforceForOrderingRelations": true }]*/
if (! a < b) {}
while (! a > b) {}
foo = ! a <= b;
foo = ! a >= b;
# 何时不使用
如果您不想通知不安全的逻辑否定,那么禁用此规则是安全的。