搞定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/
- 搞定NaN,靠这一篇就够了
- HTML基础,这一篇就够了
- css基础,这一篇就够了
- 线程池,这一篇就够了!
- 线程池这一篇就够了
- 深入浅出RxJava就这一篇就够了
- RxJava源码深度解析-就这一篇就够了
- awk经典,有这一篇就够了
- [转]awk经典,有这一篇就够了
- 有关大数据,看这一篇就够了!
- 自定义View,有这一篇就够了
- 关于反爬虫,看这一篇就够了
- 关于反爬虫,看这一篇就够了
- 关于反爬虫,看这一篇就够了
- Android:学习AIDL,这一篇文章就够了(上)
- Android:学习AIDL,这一篇文章就够了(上)
- Android:学习AIDL,这一篇文章就够了(下)
- Android:学习AIDL,这一篇文章就够了(上)
- Kernel.shmall和kernel.shmmax
- java调用c++
- UPS这么便宜卖,你信吗?
- Linux下搭建Android开发环境及Android真机调试
- SurfaceView的操作类
- 搞定NaN,靠这一篇就够了
- Mac Adobe CS6 完美破解激活(免替换文件/可更新)详细图文教程
- 代理模式Proxy Pattern
- Volley+Okhttp使用心得
- Spring MVC 框架搭建及详解
- Basic jpa and hibernate concepts
- 中午试打了Stiga的碳素145
- 学习封装双击返回键退出
- ftp上传图片