NaN不等于NaN
程序员文章站
2022-05-09 11:46:24
[TOC] 不知道这个小知识点用得多不多,曾经在书上看到过,所以有一些印象,前段时间顺手写出类似如下的代码 断点调试之后发现无论如何都不相等,方法parseInt()返回的结果确实是NaN,但是与右侧的NaN比较返回的结果却是false,这时候才突然想起来NaN有不等于自身的特性,所以简单收集一下资 ......
目录
不知道这个小知识点用得多不多,曾经在书上看到过,所以有一些印象,前段时间顺手写出类似如下的代码
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也就成立了。