您的位置:首页 > Web前端 > JavaScript

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值的产生。这里有些例子:

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的比较会一直返回一个无序的结果,甚至跟它自己比较。"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: