js中的有趣的数字类型--无穷大和NaN
背景:一次在计算数据累积涨跌幅和分天涨跌幅的时候,结果为Infinity和NaN的情况。Infinity是一个有趣的属性:它比任何有限数字都大。NaN也很有趣:它是数据类型但不是数字。那么我们就先从无穷大讲起
1.Infinity是什么
Infinity 属性用于存放表示正无穷大的数值。-Infinity 属性用于存放表示负无穷大的数值
提示:请使用 Number.isFinite(value)全局函数来判断一个值是否是
Infinity
值。
从这可知Infinity和-Infinity都属于number类型的特殊值:
typeof Infinity; // => 'number'
typeof -Infinity; // => 'number'
2.有趣之Infinity
Infinity大于任何有限数字,还能进行算术运算
Infinity > 100; // true
Infinity > Number.MAX_SAFE_INTEGER; // true
Infinity > Number.MAX_VALUE; // true
Infinity + 1; // Infinity
Infinity + Infinity; // Infinity
Infinity * 2; // Infinity
Infinity * Infinity; // Infinity
Infinity / 3; // Infinity
任何有限数字除0,结果都是Infinity
20 / 0; // => Infinity
任何有限数字除Infinity,结果都是0
20 / Infinity; // => 0
而对Infinity的错误操作就会出现NaN
Infinity / Infinity; // => NaN
Infinity % 20; // => NaN
3.NaN是什么
NaN 属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。
提示:请使用 isNaN() 全局函数来判断一个值是否是 NaN 值。
var h = Number('hello world'); // => h是NaN
4.有趣之NaN
在布尔值中,它是false
var h = Number('hi');
if (h) {
console.log('true');
} else {
console.log('false'); // 输出false
}
自己和自己不想等
var x = Number('abc');
console.log(x == x, 'NaN'); // false
5.努力避坑
我们虽然不常使用Infinity值。 但是,知道何时会出现Infinity值还是必要的
- 解析数据
parseFloat('10.5'); => 10.5
parseFloat('zzz); => NaN
parseInt('11', 10); => 11
parseInt(Infinity, 10); => NaN
- JSON序列化
const worker = {
salary: Infinity
};
JSON.stringify(worker); // => '{ "salary": null }'
-
Math 函数
const numbers = [1, 2];
const empty = [];
Math.max(...numbers); // => 2
Math.max(...empty); // => -Infinity
Math.min(...numbers); // => 1
Math.min(...empty); // => Infinity
6.总结
Infinity和NaN都是特殊的数字值,但是NaN
是唯一一个和自身不相等的值。
解析来自输入的数字时,必须小心Infinity:Number('Infinity'),parseFloat('Infinity')返回实际的Infinity。 当使用JSON.stringify()序列化时,Infinity变为null