④写给后端工程师的JavaScript教程——js有趣的非数字值NaN、Infinity

来源:互联网 发布:算法导论pdf百度云 编辑:程序博客网 时间:2024/05/31 05:28

js中的数字

js中的数字是不区分整数值和浮点数值的,所有的数字均用浮点数值表示。那么数字类型可以表示的范围是怎么样的呢?

js使用IEEE754(二进制浮点数标准)来表示整数和浮点数。
在js中数字类型的最小值为:5e-324
最大值为:1.7976931348623157e+308
注意下这两个边界

在后端开发中我们知道如果数字操作或者运算后的范围超出这个边界那么就会报溢出的错误。但是在js中会不会也这样报错呢?

console.log(Number.MAX_VALUE+Number.MAX_VALUE);console.log(-Number.MAX_VALUE-Number.MAX_VALUE);

两个最大值相加肯定会超出他本身,那么就会溢出,溢出后js的输出结构又是怎么样的呢?

Infinity-Infinity

这就说明js的上溢结果为Infinity,下溢结果为-Infinity而不是报错。这和后端语言不一样。

JS的溢出计算

在js中有个很有意思的运算1/0 在后端工程师中都知道0不能作为除数,这个我们小学数学中背过的规则,那么在js中会怎样呢?

console.log(1/0);console.log(1/-0);

输出结果为:
Infinity
-Infinity
本来我们知道0的正负都没有意义的,那在这儿0的正负都参与了运算而且还没有报错。其实这是很有挑战很有魅力的运算
再来看两个有趣的判断:

console.log(1/0 === 1/-0);console.log(0 === -0);

输出结果:
false
true
本来感觉刷新三观了,但是别急。慢慢来想这个还是有道理的,0的正负本来是没有意义的,那么他们两是相等的。Infinity和-Infinity自然是不相等的,所以大家要理性的来分析这件事。

特殊的非数字值NaN

js中的非数字值是非常非常特殊的,他和任何值都不相等,包括自身。所以就不能用作判断语句使用。

NaN来自何处

其实NaN本来是Number的一个属性,可以这样来使用Number.NaN。但是在后续版本中也可以使用NaN这种预定义的全局属性来直接使用。在哪些情况下会返回NaN呢?一些求根或者转换中会生成,比如以下的代码:

var s = parseInt('marswill');console.log(s == NaN);

这儿我们做了两个验证,第一个为parseInt转换数据成Int时如果传入参数为非数字会返回NaN。第二个问题为返回的NaN和全局NaN并不相等,虽然两者显示一模一样但是确实不相等。

正确的处理方法

刚刚已经演示了NaN结果不能直接使用 s == NaN来比较那么怎么样处理呢?
有一个isNaN()来判断:

var s = parseInt('魏永强 http://blog.csdn.net/marswill');console.log(s == NaN);if (isNaN(s)) {    console.log('非数字');}else{    console.log('是数字');}

返回结果为非数字

阅读全文
1 0