NaN为什么不相等

  在 JavaScript 中有个很反直觉的事情,两个 NaN 不管是 == 还是 === ,返回结果都是 flase ,这也是一道很常出现的面试题,这里进行一个说明。

什么是 NaN

NaN 的全称是 Not a Number,它表示一个非数字的数值结果。常见的情况如下:

1
2
3
parseInt("hello") // NaN
Math.sqrt(-1) // NaN
0 / 0 // NaN

在 JavaScript 中,NaN 是一个特殊的数值类型,typeof NaN 得到的是 'number'

为什么不相等

这其实是 JavaScript 遵循 IEEE 754 浮点数标准的一部分。在该标准中:

任何一个 NaN 都不等于任何其他 NaN,包括它自己。

这是为了在浮点运算中体现“不确定性”的概念。

举个例子:

1
2
3
let result1 = 0 / 0;
let result2 = Math.sqrt(-1);
console.log(result1 === result2); // false

虽然两者看起来都是 NaN,但它们的来源不同,IEEE 754 标准设计者的意图是:两个“未知”结果不能直接认为是“相等”的。

甚至:

1
2
3
4
const a = NaN;
console.log(a === a); // false
// ps:因为 NaN !== NaN 是唯一为 true 的非自反性比较,所以可以这样判断是不是NaN
console.log(a !== a); // 只有NaN不等于本身

如何进行判断

如果要判断一个值是不是 NaN ,可以使用 Number.isNaN

1
2
3
Number.isNaN(NaN); // true
Number.isNaN("hello"); // false
Number.isNaN(undefined); // false

如果你需要强制类型转换,可以用这种旧的全局方式 isNaN,但是并不推荐:

1
2
isNaN("hello"); // true ( "hello" 进行了强制类型转换,转成了 NaN)
Number.isNaN("hello"); // false
作者

Fu9Zhou

发布于

2025-04-13

许可协议