The logical negation operator (!) should be used in correct order

  • BAD_NEGATION_OPERATOR
  • Error
  • Medium
  • cwe

This rule applies when the logical negation operator (!) is evaluated in incorrect order because of operator precedence.

For example, if code to test whether x is not array is written like !x instanceof Array, it is evaluated as (!x) instanceof Array, resulting in false regardless of x. In this case, explicit parentheses should be used as in !(x instanceof Array) because ! has higher precedence than binary operators.

The following binary operators are considered: in, instanceof, <, >, <=, >=, ==, !=, ===, !==

Noncompliant Code Example

// Example 1
if (!x instanceof Array) { // BAD_NEGATION_OPERATOR alarm. The result is always false.
    console.log('x is not array');
}

// Example 2
if (!x.length === 0) { // BAD_NEGATION_OPERATOR alarm. The result is always false.
    console.log('x is not empty');
}

Compliant Code Example

// Example 1
if (!(x instanceof Array)) {
    console.log('x is not array');
}

// Example 2
if (!(x.length === 0)) {
    console.log('x is not empty');
}

Version

This rule was introduced in DeepScan 1.0.0-alpha.

See