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:
NaN
===NaN
orNaN
==NaN
evaluate to falseNaN
!==NaN
orNaN
!=NaN
evaluate to true
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) {}