新增的静态属性
ES6在Number对象上新增了一些静态常量属性,用于辅助计算。
-
Number.EPSILON
Number.EPSILON
(2-52)代表任意两个数值之间的最小差值,换句话说,如果a与b的差值的绝对值小于Number.EPSILON
,那么我们就可以认为这两个值是相等的。即:如果
|a-b| < Number.EPSILON
,则可以认为a=b
。在JavaScript中,整数并不是一个单独的类型。和我们想象的可能有些不同的是,JS中所有的数字都是双精度浮点数。但是浮点运算只能产生近似的结果,四舍五入到最接近的整数,所以有的时候,运算的精度会是一个问题。
console.log(0.1 + 0.2); //0.30000000000000004 console.log(0.1 + 0.2 === 0.3);//false 复制代码
这种时候我们就可以直接使用常量
Number.EPSILON
来进行精度判断了:function isEqual(a, b) { return Math.abs(a - b) < Number.EPSILON; } console.log(isEqual(0.1 + 0.2, 0.3));//true 复制代码
-
Number.MAX_SAFE_INTEGER与Number.MIN_SAFE_INTEGER
这两个常量
Number.MAX_SAFE_INTEGER
(253-1)、Number.MIN_SAFE_INTEGER
(-253+1)和他们的名字一样,分别代表了JS中能够安全处理的最大整数和最小整数。前面已经介绍过,JS中的数字都是双精度浮点数,而双精度浮点数最多能表示53位精度的整数,它表示的整数范围是 [ -253+1 , 253-1 ] 。当一个整数超出这个范围之后,JS便不能够再“安全”地处理这个整数了,这里的“安全”指的是JS能够正确地表示整数并且能够正确地比较整数。
console.log(2 ** 53 - 1 === Number.MAX_SAFE_INTEGER); console.log(-(2 ** 53 - 1) === Number.MIN_SAFE_INTEGER); //显然,a+1===a+2,是不符合我们的预期的。 console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2); //true 复制代码
新增的静态函数
-
Number.isNaN
函数类型:
//接收一个任意类型的可选参数,返回一个布尔值结果 (v?:any)=>boolean 复制代码
Number.isNaN
是用于解决原本的全局函数window.isNaN
的缺陷的。在window.isNaN
中,会先将传入的非number
类型的参数转换为number
类型,然后进行判断,这就导致了一些在我们看来很奇怪的结果://'str'转成number类型之后得到 NaN console.log(isNaN('str')); //true //''转成number类型之后得到0 console.log(isNaN('')); //false 复制代码
Number.isNaN
修正了这一行为,不会将参数转成number
,所以它的执行结果可能会更符合我们的预期。console.log(Number.isNaN('str')); //false console.log(Number.isNaN('')); //false 复制代码
-
Number.isFinite
函数类型:
//接收一个任意类型的可选参数,返回一个布尔值结果 (v?:any)=>boolean 复制代码
Number.isFinite
用于判断传入的参数是否是一个有穷值。它与全局的window.isFinite
的关系可以类比Number.isNaN
函数与isNaN
的关系:全局的isFinite
函数会将参数转为number
,而Number.isFinite
不会这样做。基本上,
Number.isFinite(a) === (typeof a=== 'number' && isFinite(a))
console.log(Number.isFinite(42)); //true console.log(isFinite(42)); //true console.log(Number.isFinite('42')); //false console.log(isFinite('42')); //true 复制代码
-
Number.isInteger
函数类型:
//接收一个任意类型的可选参数,返回一个布尔值结果 (v?:any)=>boolean 复制代码
因为JS中的数字都是双精度浮点数,所以我们是没有办法通过类型来判断一个数是否是整数的。ES6新增的
Number.isInteger
就是用于解决这个问题——判断一个值是不是整数,的辅助函数。console.log(Number.isInteger('42')); //false console.log(Number.isInteger(42.0)); //true console.log(Number.isInteger(42.1)); //false 复制代码
-
Number.isSafeInteger
Number.isSafeInteger
和Number.isInteger
相比,多了一个限定范围,也就是安全地整数范围 [ Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER ] 。