Lint Rules

useIsNan (since v12.0.0)

Require calls to isNaN() when checking for NaN.

In JavaScript, NaN is a special value of the Number type. It’s used to represent any of the “not-a-number” values represented by the double-precision 64-bit format as specified by the IEEE Standard for Binary Floating-Point Arithmetic.

Because NaN is unique in JavaScript by not being equal to anything, including itself, the results of comparisons to NaN are confusing:

Therefore, use Number.isNaN() or global isNaN() functions to test whether a value is NaN.

Note that Number.isNaN() and isNaN() have not the same behavior. When the argument to isNaN() is not a number, the value is first coerced to a number. Number.isNaN() does not perform this coercion. Therefore, it is a more reliable way to test whether a value is NaN.

Source: use-isnan.

Examples

Invalid

123 == NaN
nursery/useIsNan.js:1:1 lint/nursery/useIsNan ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   Use the Number.isNaN function to compare with NaN.
  
  > 1 │ 123 == NaN
   ^^^^^^^^^^
    2 │ 
  
123 != NaN
nursery/useIsNan.js:1:1 lint/nursery/useIsNan ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   Use the Number.isNaN function to compare with NaN.
  
  > 1 │ 123 != NaN
   ^^^^^^^^^^
    2 │ 
  
switch(foo) { case (NaN): break; }
nursery/useIsNan.js:1:20 lint/nursery/useIsNan ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   'case NaN' can never match. Use Number.isNaN before the switch.
  
  > 1 │ switch(foo) { case (NaN): break; }
                      ^^^^^
    2 │ 
  
Number.NaN == "abc"
nursery/useIsNan.js:1:1 lint/nursery/useIsNan ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

   Use the Number.isNaN function to compare with NaN.
  
  > 1 │ Number.NaN == "abc"
   ^^^^^^^^^^^^^^^^^^^
    2 │ 
  

Valid

if (Number.isNaN(123) !== true) {}

foo(Number.NaN / 2)

switch(foo) {}