Number类

Number也就是我们常说的数字,我们通常用的数字是十进制的,当然也还有二进制,八进制,十六进制等,二进制跟八进制在ES6中有了新的写法eg:
0b111110111 === 503 // true 二进制 0b或是0B开头
0o767 === 503 // true 八进制 0o或是0O开头

要转换成十进制的话可以通过Number来转换,eg:
Number('0o10') // 8 Number(010)
isFinite 静态方法 通过调用此方法来判断该数值是否有限,有限返回true,无限返回false eg:
Number.isFinite(12313) // true
Number.isFinite(Infinity) // false
Number.isFinite(NaN) // false

若参数不是数值类型,则返回false
isNaN 静态方法,用来判断是否是数值是数值返回false,不是数值返回true
is not a number 缩写成isNaN,故而是数值返回false,不是返回trueeg:
Number.isNaN(12) // false
Number.isNaN('12') // false
Number.isNaN(NaN) // true

isNaN的参数或者是参数表达式的运算结果只要不是NaN,则一律返回false
isFinite 跟 isNaN还是window的全局方法
不过全局的isFinite跟isNaN会对传递的参数进行一次隐式转换成数值调用Number()方法,而Number下面的静态方法isFinite及isNaN只针对数值及NaN做判断,不会主动调用Number()方法 eg:
isFinite('12') // true
Number.isFinite('12') // false
isNaN('NaN') // true
Number.isNaN('NaN') // false

parseInt、parseFloat Number的静态方法,与全局的方法一致eg:
parseInt('12.12') // 12
Number.parseInt('12.12') // 12
Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true

isInteger Number的静态方法,用来判断参数是否是一个整数类型eg:
Number.isInteger(12.12) // false
Number.isInteger(12) // true

只要参数不是数值,都将会返回false,也就是说该方法在判断时,只针对数值有效,不会主动调用Number方法进行隐式转换参数
Number.isInteger('1') // false
Number.isInteger(null) // false

第54位及后面的位就会被丢弃,这种情况下,Number.isInteger可能会误判。 eg:
Number.isInteger(3.0000000000000002) // true
若需要对数值数据精度要求高的话,还是不建议使用该方法来判断是否为整数

EPSILON Number 的静态属性,表示1与大于 1 的最小浮点数之间的差eg:
Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// "0.00000000000000022204"

浮点数在二进制世界中是不太友好的,计算起来也是不精确的,eg:
0.1 + 0.2 // 0.30000000000000004
0.1 + 0.2 === 0.3 // false
在精确度高的情况下,这就产生误差了

Number.EPSILON可以用来设置“能够接受的误差范围”。比如,误差范围设为 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

function withinErrorMargin (left, right) {
  return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}

0.1 + 0.2 === 0.3 // false
withinErrorMargin(0.1 + 0.2, 0.3) // true

1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true 为浮点数运算部署了一个误差允许范围


isSafeInteger Number的静态属性,范围在-2^53到2^53之间(不含两个端点)eg:
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) // false
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true
Number.MIN_SAFE_INTEGER === Math.pow(-2, 53) // false
Number.MIN_SAFE_INTEGER === Math.pow(-2, 53) + 1 // true

js能精确表示的极限值,超过边界即取其边界值eg:
Number.MAX_SAFE_INTEGER === 9007199254740991
// true
Number.MIN_SAFE_INTEGER === -9007199254740991
// true


通过isSafeInteger来判断该数值是否是在这范围之内eg:
Number.isSafeInteger('12') // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false

首先来说,这是用来判断是否在范围内的整数,则参数首先应该满足的是整数的数值类型,其次再与MAX_SAFE_INTEGER及MIN_SAFE_INTEGER作范围比较,则得出结果
大致实现方式:

Number.isSafeInteger = function (n) {
  return (typeof n === 'number' &&
    Math.round(n) === n &&
    Number.MIN_SAFE_INTEGER <= n &&
    n <= Number.MAX_SAFE_INTEGER);
}

在使用isSafeInteger参与计算时,注意应验证每个计算数,若是参与的计算值不在安全值范围内,则计算机会以安全值存储导致运算结果出错,eg:
Number.isSafeInteger(9007199254740993)
// false
Number.isSafeInteger(990)
// true
Number.isSafeInteger(9007199254740993 - 990)
// true
9007199254740993 - 990
// 返回结果 9007199254740002
// 正确答案应该是 9007199254740003

NEGATIVE_INFINITY,POSITIVE_INFINITY,MIN_VALUE,MAX_VALUE Number的静态属性,用来表示负无穷,正无穷,最小值及最大值eg:
Number.NEGATIVE_INFINITY
// -Infinity
Number.POSITIVE_INFINITY
// Infinity
Number.MIN_VALUE
// 5e-324
Number.MAX_VALUE
// 1.7976931348623157e+308

百度已收录
分享