搞定NaN,靠这一篇就够了

来源:互联网 发布:sci-hub 知乎 编辑:程序博客网 时间:2024/04/29 20:39

NaN, “Not a Numbe**r”的缩写,直译过来就是“非数字”。本质上是“非数字的特殊值**”,我们把这个词拆分成“非数字”和“特殊值”,
“非数字”很好理解,

var str = “i am string”;var nl = null;var bl = true;

上面都是非数字。那么怎么理解“特殊值”呢?“特殊值”就是无法用数字表示的值。好,可能不好理解,先放一放,先看一下NaN的类型,

typeof NaN  // 'number'

很奇怪不是吗?NaN表示非数字,但是他又是number类型,感觉有点矛盾。以前看到有篇文章说,这是JavaScript设计的一个错误,后来ECMAScript沿用了这个错误。不管了,我们只要记住NaN的类型是number这点就行了。那么

什么情况下会出现NaN?
1.直接定义

var nan = NaN;

2.在转换为number的过程中出现了错误

var str = "i am string";var str2int = parseInt(str);   //NaN

此时str2int就是NaN。
前面说过,NaN表示“非数字的特殊值”,而“特殊值就是无法用数字表示的值”。来理解一下这句话,str显然是一个字符串,即string类型,我们用parseInt函数将其转换为number类型。实际上确实是转换成功了,我们可以验证一下:

typeof parseInt(str)  //'number'

我们发现转换后的结果是number类型,说明类型确实是转换成功了。但是转换后的值是多少呢?不知道,或者说无法用数字表示,这种情况下就用NaN表示。

如何判断一个值是否是NaN?
方案一:用 ==

console.log(NaN == NaN);

打印false。很多初学者看到这里可能会大跌眼镜,没错,你没看错,NaN与所有值都不相等,包括他自己

console.log(NaN !== NaN);   //true

parseInt(“i am string”)是NaN,parseFloat(“bbb”)也是NaN,这两个NaN不相等,也是有一定道理的。所以用这个方法来判断一个值是否是NaN是行不通的。
方案二:用isNaN()方法
从函数名就可以知道,该方法是用来判断一个值是否是NaN的。该方法会先隐式的将它的参数转换成数字

isNaN("i am string");

你可以将上面的过程看成两步,第一步,将参数转换成数字,parseInt(“i am string”)或parseFloat(“i am string”),我们知道,这个结果一定是NaN,然后再isNaN(NaN),返回true。所以isNaN(“i am string”)的结果就是true。同理:

console.log(isNaN('hello'));  // trueconsole.log(isNaN(['hello']));    // trueconsole.log(isNaN({}));       // true

那么什么时候返回false呢?
如果第一步(将参数转换成数字)的结果不是NaN,那么就会返回false了。

console.log(isNaN('123'));       // false

parseInt(‘123’)的结果是123,而123不是NaN,所以调用isNaN(123)的结果自然就是false了。
不过这个方案容易给人一种错觉,如isNaN(‘hello’)的结果是NaN,搞得好像字符串’hello’是NaN一样,因此我不建议采用这种方法。
方案三: 用 Number.isNaN()方法
如果传入的参数是NaN,就返回true,如果不是,就返回false。

console.log(Number.isNaN(NaN));            // trueconsole.log(Number.isNaN(parseInt('i am string')));  // trueconsole.log(Number.isNaN('hello'));        // falseconsole.log(Number.isNaN(['hello']));          // falseconsole.log(Number.isNaN({}));             // false

该方法相对于方案二严谨多了,推荐使用这种方式。
原文地址:
http://tanlian.co/2015/11/16/%E6%90%9E%E5%AE%9ANaN%EF%BC%8C%E9%9D%A0%E8%BF%99%E4%B8%80%E7%AF%87%E5%B0%B1%E5%A4%9F%E4%BA%86/

0 0