JavaScript中不可不知的NaN问题
2014-06-01 16:59
239 查看
转载自:http://www.boode.com.cn/share/javascript_nan.html
经常在javascript代码调试过程中会出现一个莫名其妙的“NaN”,到底它是表示什么呢?通过这篇文章我们来探析一下NaN的秘密。NaN,是Not a Number的缩写, NaN 用于处理计算中出现的错误情况,如果参与计算的值不是一个数字,计算结果就会出现NaN。
一些操作会导致NaN值的产生。这里有些例子:
我们可以尝试使用typeof来确定NaN的类型,返回结果可能是出乎你的意料的:
这情情况下,NaN并不意味着是一个数字,它的类型是数字。
保持冷静,因为下面还有很多混乱的地方。让我们比较两个NaN:
也许这是因为我们没有使用严格等价(===)操作?显然不是。
好吧!难道是因为这两个NaN是从不同的操作产生出来的?那么这样...
再疯狂一点
直接比较两个NaN呢?
因为有很多方法来表示一个非数字,所以一个非数字不会等于另一个为NaN的非数字,它还是有一定道理的。不过这也是我为什么时而崩溃的原因:
这是对你的提醒,NaN的意思是“不为NaN".
— Ariya Hidayat (@AriyaHidayat)
不过幸运的是,在即将到来的ECMAScript 6中, 有一个Number.isNaN() 方法提供可靠的NaN值检测。(随便说下,你已经可以在最新版的Chrome和firefox中使用这个方法了)。在2014年4月的规范草稿中,有着如下记载:
当传入一个数字参数并调用 Number.isNaN 时,会进行以下几步:
1. 如果Type(number) 不是数字, 返回 false.
2. 如果数字是NaN, 返回true.
3. 其他情况,返回false.
换句话说,只有在参数是真正的NaN时,才会返回true
"在计算中, NaN, 代表一个非数字, 是用来呈现未定义(undefined)和不可呈现(unrepresentable)的数据类型, 尤其是在浮点计算中。"
"与NaN的比较会一直返回一个无序的结果,甚至跟它自己比较。"
经常在javascript代码调试过程中会出现一个莫名其妙的“NaN”,到底它是表示什么呢?通过这篇文章我们来探析一下NaN的秘密。NaN,是Not a Number的缩写, NaN 用于处理计算中出现的错误情况,如果参与计算的值不是一个数字,计算结果就会出现NaN。
一些操作会导致NaN值的产生。这里有些例子:
Math.sqrt(-2) Math.log(-1) 0/0 parseFloat('foo')
我们可以尝试使用typeof来确定NaN的类型,返回结果可能是出乎你的意料的:
console.log(typeof NaN); // 'number'
这情情况下,NaN并不意味着是一个数字,它的类型是数字。
保持冷静,因为下面还有很多混乱的地方。让我们比较两个NaN:
var x = Math.sqrt(-2); var y = Math.log(-1); console.log(x == y); // false
也许这是因为我们没有使用严格等价(===)操作?显然不是。
var x = Math.sqrt(-2); var y = Math.log(-1); console.log(x === y); // false
好吧!难道是因为这两个NaN是从不同的操作产生出来的?那么这样...
var x = Math.sqrt(-2); var y = Math.sqrt(-2); console.log(x == y); // false
再疯狂一点
var x = Math.sqrt(-2); console.log(x == x); // false
直接比较两个NaN呢?
console.log(NaN === NaN); // false
因为有很多方法来表示一个非数字,所以一个非数字不会等于另一个为NaN的非数字,它还是有一定道理的。不过这也是我为什么时而崩溃的原因:
这是对你的提醒,NaN的意思是“不为NaN".
— Ariya Hidayat (@AriyaHidayat)
不过幸运的是,在即将到来的ECMAScript 6中, 有一个Number.isNaN() 方法提供可靠的NaN值检测。(随便说下,你已经可以在最新版的Chrome和firefox中使用这个方法了)。在2014年4月的规范草稿中,有着如下记载:
当传入一个数字参数并调用 Number.isNaN 时,会进行以下几步:
1. 如果Type(number) 不是数字, 返回 false.
2. 如果数字是NaN, 返回true.
3. 其他情况,返回false.
换句话说,只有在参数是真正的NaN时,才会返回true
console.log(Number.isNaN(NaN)); // true console.log(Number.isNaN(Math.sqrt(-2))); // true console.log(Number.isNaN('hello')); // false console.log(Number.isNaN(['x'])); // false console.log(Number.isNaN({})); // false
"在计算中, NaN, 代表一个非数字, 是用来呈现未定义(undefined)和不可呈现(unrepresentable)的数据类型, 尤其是在浮点计算中。"
"与NaN的比较会一直返回一个无序的结果,甚至跟它自己比较。"
相关文章推荐
- C#中C/C++程序员不可不知的问题
- 正确高效使用数据库不可不知的索引失效问题
- java中你不可不知的问题
- 十个不可不知的Javascript小技巧
- IE8下javascript的时间函数Date()不兼容问题,显示NAN【转】
- javascript: new Date(string)在IE中显示NaN的问题!
- OpenDaylight你不可不知的十大问题——OpenDaylight是什么?
- JavaScript 面向对象程序设计 变量,函数定义之不可不知
- 玩转web之javaScript(五)---js和jquery一些不可不知的方法(input篇)
- 服务器租用的那些事,您不可不知的问题,如何选择最佳的合作伙伴呢?
- 玩转web之javaScript(五)---js和jquery一些不可不知的方法(input篇)
- 关于租用美国服务器不可不知的秘密:问题如下,点击看进来!多一份选择多一份收货!
- C/C++/C#程序员不可不知的的问题
- 玩转web之javaScript(五)---js和jquery一些不可不知的方法(input篇)
- Javascript 不可不知的秘密 -- Class 与 面向对象
- JavaScript Tip/Trick: 动态创建Table时,在IE中需要注意的一个问题
- showDialog回传值问题javascript
- 用JavaScript解决ASP.NET服务器控件造成的刷新问题
- JavaScript 脚本文件编码导致的问题
- 不可不知的10条定律