JS中NAN和Infinity两个特殊值需要注意的地方


每一天都以许下希望开始,以收获经验结束。

现在来讨论讨论在JS中操作数值进行计算的时候,会出现的两个特殊值:NaNInfinity

NaN

在JS中,它被解释为”not a number”,一般在将一个字符串解析成数字时候出现的错误:

1
Number('XYZ'); // NaN

NaN与所有的值都不相等,哪怕就是算与自己相比较都不相等。

1
2
3
NaN === NaN; // false
NaN === 1; // false
...

但是请注意使用typeof计算NaN的类型的时候,它竟然返回的是number。。。

1
typeof NaN;   // 'number'

很是无语。

怎么判断一个值是否为NaN?

NaN是javascript唯一个和自身不相等的值,所以我们不能使用”==”或者”===”来判断它,我们需要使用ES6提供Number.isNaN来判断它,ES6之前有一个全局函数isNaN也可以用来判断。

1
Number.isNaN(NaN); // true

Number.isNaNisNaN这两个函数的表现形式是不相同的:

1
2
isNaN('xyz'); // true
Number.isNaN('xyz'); // false

从这里看出isNaN会将参数强制转换为数值类型,然后再去判断,但是Number.isNaN不会这么做。

Number的强制转换

当使用关键字Number进行类型显示转换的时候,里面究竟做了什么呢?这里简单说明下。

看如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
let obj = {
valueOf: function (){ return 2; }
}
Number(obj); // 2

obj = {
valueOf: function (){ return NaN; }
}
const objNum = Number(obj); // NaN
Number.isNaN(obj); // false
Number.isNaN(objNum); // true
isNaN(obj); // true

这里可以看出,当使用Number强转的时候,会去调用值原型上的方法valueOf,当我们重写这个方法后,就可以转换为指定的值,上面也清晰的解释了Number.isNaNisNaN的区别。

Infinity

当你去除以一个0时,就会得到这个特殊值。

1
2
3 / 0          // Infinity
Infinity / 0 // Infinity

但是请注意:

1
NaN / 0        // NaN

NaN这个值与其他值进行操作还是为NaN

对于Infinity你不能再与一个Infinity进行相互作用,不然就会得到NaN

1
2
Infinity / Infinity // NaN
Infinity - Infinity // NaN

但是可以做乘和加的运算

1
2
Infinity + Infinity // Infinity
Infinity * Infinity // Infinity

因为这个值表象为无穷,上面四个运算就是符合数学逻辑的。

有错误或者描述不清晰的地方,欢迎指正~

'干巴爹'