NaN不等于NaN

4次阅读

共计 666 个字符,预计需要花费 2 分钟才能阅读完成。

不知道这个小知识点用得多不多,曾经在书上看到过,所以有一些印象,前段时间顺手写出类似如下的代码

var result;
if (parseInt('abc')==NaN) {return "相等";} else {return "不等";}

断点调试之后发现无论如何都不相等,方法 parseInt() 返回的结果确实是 NaN,但是与右侧的 NaN 比较返回的结果却是 false,这时候才突然想起来 NaN 有不等于自身的特性,所以简单收集一下资料做个整理

原因

了解原因之前我们先明确一个问题,什么时候回出现 NaN,理论上来说有两种情况

  • 表达式计算
  • 类型转换

我们逐个分析

表达式计算

当运算中使用了 + – * / 等运算符的时候,js 会自动进行转换,讲参与计算的变量转换成 js 的基本类型之一的 Number 类型,如果转换失败就会返回 NaN。比如说:

console.log(12 + 'a'); //NaN

类型转换

比较典型的就是最初的例子里使用的 parseInt(),除此之外还有 parseFloat() 和 Number(),传入一个非数变量结果就是 NaN,很好理解,顺便一提 parse 系列方法与 Number() 有些不同。

parseInt('123abc'); // 123
Number('123abc'); // NaN

总结

从上面两种产生 NaN 的情况来看,NaN 是一种异常的结果,也就是“not a number”,虽然它也是一个变量,但它是描述性变量,’a’ 不是一个数字(not a number),’b’ 也不是一个数字(not a number),但是 ’a’ 和 ’b’ 并不相等,所以 NaN != NaN 也就成立了。

正文完
 0