NaN为什么不相等
在 JavaScript
中有个很反直觉的事情,两个 NaN
不管是 ==
还是 ===
,返回结果都是 flase
,这也是一道很常出现的面试题,这里进行一个说明。
什么是 NaN
NaN
的全称是 Not a Number,它表示一个非数字的数值结果。常见的情况如下:
1 | parseInt("hello") // NaN |
在 JavaScript 中,NaN
是一个特殊的数值类型,typeof NaN
得到的是 'number'
。
为什么不相等
这其实是 JavaScript 遵循 IEEE 754 浮点数标准的一部分。在该标准中:
任何一个 NaN 都不等于任何其他 NaN,包括它自己。
这是为了在浮点运算中体现“不确定性”的概念。
举个例子:
1 | let result1 = 0 / 0; |
虽然两者看起来都是 NaN,但它们的来源不同,IEEE 754 标准设计者的意图是:两个“未知”结果不能直接认为是“相等”的。
甚至:
1 | const a = NaN; |
如何进行判断
如果要判断一个值是不是 NaN
,可以使用 Number.isNaN
:
1 | Number.isNaN(NaN); // true |
如果你需要强制类型转换,可以用这种旧的全局方式 isNaN
,但是并不推荐:
1 | isNaN("hello"); // true ( "hello" 进行了强制类型转换,转成了 NaN) |