Avoid direct comparison with NaN

This page is not yet available in Spanish. We are working on its translation.
If you have any questions or feedback about our current translation project, feel free to reach out to us!

Metadata

ID: javascript-best-practices/use-isnan

Language: JavaScript

Severity: Error

Category: Best Practices

CWE: 570

Description

In JavaScript, NaN (Not-a-Number) is a unique value that is not equal to anything, including itself. This means any direct comparison with NaN using equality (==, ===) or inequality (!=, !==) operators will always return false.

Non-Compliant Code Examples

123 == NaN;
123 === NaN;
NaN === "abc";
NaN =="abc";
123 != NaN;
123 !== NaN;
NaN !== "abc";
NaN != "abc";
NaN < "abc";
"abc" < NaN;
NaN > "abc";
"abc" > NaN;
NaN <= "abc";
"abc" <= NaN;
NaN >= "abc";
"abc" >= NaN;
123 == Number.NaN;
123 === Number.NaN;
Number.NaN === "abc";
Number.NaN == "abc";
123 != Number.NaN;
123 !== Number.NaN;
Number.NaN !== "abc";
Number.NaN != "abc";
Number.NaN < "abc";
"abc" < Number.NaN;
Number.NaN > "abc";
"abc" > Number.NaN;
Number.NaN <= "abc";
"abc" <= Number.NaN;
Number.NaN >= "abc";
"abc" >= Number.NaN;
x === Number?.NaN;
x === Number['NaN'];

Compliant Code Examples

var x = NaN;
isNaN(NaN) === true;
isNaN(123) !== true;
Number.isNaN(NaN) === true;
Number.isNaN(123) !== true;
foo(NaN + 1);
foo(1 + NaN);
foo(NaN - 1)
foo(1 - NaN)
foo(NaN * 2)
foo(2 * NaN)
foo(NaN / 2)
foo(2 / NaN)
var x; if (x = NaN) { }
var x = Number.NaN;
isNaN(Number.NaN) === true;
Number.isNaN(Number.NaN) === true;
foo(Number.NaN + 1);
foo(1 + Number.NaN);
foo(Number.NaN - 1)
foo(1 - Number.NaN)
foo(Number.NaN * 2)
foo(2 * Number.NaN)
foo(Number.NaN / 2)
foo(2 / Number.NaN)
var x; if (x = Number.NaN) { }
x === Number[NaN];
https://static.datadoghq.com/static/images/logos/github_avatar.svg https://static.datadoghq.com/static/images/logos/vscode_avatar.svg jetbrains

Seamless integrations. Try Datadog Code Analysis