DEV Community

mmvergara
mmvergara

Posted on

1 1 1 1 1

JavaScript NaN Quirks: Features, Not Flaws.

NaN, or "Not-a-Number," is one of those JavaScript quirks that can trip you up if you're not paying attention. But here's the thing: NaN isn't just a quirky value—it's a sentinel value that represents an invalid number. It's not the absence of a number, and it's definitely not zero. It's a specific, intentional signal that something went wrong in a numeric operation. (or i don't know, i didn't create the language)

What is NaN?

NaN comes from the IEEE 754 spec, which defines how numbers work in JavaScript. It's not a bug or a mistake—it's a deliberate part of the language. Think of NaN as a red flag that says, "Hey, this operation didn't make sense mathematically."

For example:

console.log(Math.sqrt(-1)); // NaN
Enter fullscreen mode Exit fullscreen mode

You can't take the square root of a negative number (at least not in real numbers), so JavaScript gives you NaN. It's like asking, "What's the color of happiness?"—it's a question that doesn't have a meaningful answer.

NaN's Quirky Behavior

Here's where things get weird. NaN is the only value in JavaScript that is not equal to itself:

console.log(NaN === NaN); // false
Enter fullscreen mode Exit fullscreen mode

This isn't a bug—it's by design. According to the ECMAScript spec, NaN is "unordered" with respect to other values, including itself. This means you can't use === to check for NaN. Instead, you need to use Number.isNaN():

console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("Hello")); // false
Enter fullscreen mode Exit fullscreen mode

Why NaN is a Number

Here's the weird thing. NaN is technically a number type. Yes, you read that right. The typeof NaN is "number". This is because NaN is part of the IEEE 754 spec, which defines numeric operations. When a numeric operation fails, it doesn't make sense to return undefined, null, or -1—those aren't numbers. Instead, JavaScript returns NaN, which is still a number, just an invalid one.

Example

Let's say you're building a function to calculate the average of an array of numbers. What happens if the array contains non-numeric values?

function calculateAverage(arr) {
  const sum = arr.reduce((acc, val) => acc + val, 0);
  return sum / arr.length;
}

console.log(calculateAverage([1, 2, "three", 4])); // NaN
Enter fullscreen mode Exit fullscreen mode

Here, the string "three" can't be added to the sum, so the result is NaN. This is a great example of how NaN can sneak into your code and cause unexpected behavior.


Despite all of this weirdness, NaN is a powerful tool. It's the only value that makes sense to return when a numeric operation fails, we have to learn how to work with the language.

NaN is a unique and important concept in JavaScript. It's not just a value—it's a signal that something went wrong in your calculations.

SurveyJS custom survey software

Simplify data collection in your JS app with a fully integrated form management platform. Includes support for custom question types, skip logic, integrated CCS editor, PDF export, real-time analytics & more. Integrates with any backend system, giving you full control over your data and no user limits.

Learn more

Top comments (0)

Billboard image

Create up to 10 Postgres Databases on Neon's free plan.

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Try Neon for Free →