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) |