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')); // true
console.log(isNaN(['hello'])); // true
console.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)); // true
console.log(Number.isNaN(parseInt('i am string'))); // true
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN(['hello'])); // false
console.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/