disallow negating the left operand of relational operators (no-unsafe-negation) #595

Closed
feross opened this Issue Aug 19, 2016 · 0 comments

Projects

None yet

1 participant

@feross
Owner
feross commented Aug 19, 2016

Just as developers might type -a + b when they mean -(a + b) for the negative of a sum, they might type !key in object by mistake when they almost certainly mean !(key in object) to test that a key is not in an object. !obj instanceof Ctor is similar.

Rule Details

This rule disallows negating the left operand of Relational Operators.

Relational Operators are:

  • in operator.
  • instanceof operator.

Examples of incorrect code for this rule:

/*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.
}

Examples of correct code for this rule:

/*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
}

if(("" + !key) in object) {
    // make operator precedence and type conversion explicit
    // in a rare situation when that is the intended meaning
}

http://eslint.org/docs/rules/no-unsafe-negation

Likely to catch bugs, and there's basically never a reason to write code that this would flag, so I'll merge this into the standard v8 beta.

@feross feross modified the milestone: v8 Aug 19, 2016
@feross feross added a commit to feross/eslint-config-standard that referenced this issue Aug 19, 2016
@feross disallow negating the left operand of relational operators (no-unsafe…
…-negation)

feross/standard#595
a710453
@feross feross closed this Aug 19, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment