学习ES6中的数值扩展小记

数值的扩展

1. 二进制和八进制表示法

提供了二进制和八进制数值的新写法,分别用前缀 0b 和 0o 来进行表示,从 ES5 开始,在严格模式中,八进制不再允许使用前缀 0 表示
如果要使用 0b 和 0o 前缀的字符串数值转为十进制,需要使用 Number 方法

Number('0b111') // 7

2. Number.isFinite(),Number.isNaN()

Number.isFinite():用来检查一个数值是否为有限的,即不是 Infinity,当然如果参数类型不为数值,则返回 false
Number.isNaN():用来检查一个值是否为 NaN,是则返回

和传统的全局方法 isFinite()isNaN() 相比,传统方法先调用 Number() 将非数值转为数值,在进行判断,而这两个新发放则不会进行类型的转换。Number.isFinite() 对于非数值一律返回 false,Number.isNaN() 只有对于 NaN 才返回 true ,非 NaN 一律返回 false

3. Number.parseInt(),Number.parseFloat()

ES6将全局方法 parseInt()parseFloat() 移植到了 Number 对象上面,行为完全保持不变。这样做的主要目的在于,逐步减少全局性方法,使得语言逐步模块化

4. Number.isInteger()

用来判断一个数值是否为整数。参数如果不为数值,则直接返回 false

注意:
1. JavaScript 内部,整数和浮点数采用的是同样的存储方式,所以 25 和 25.0 被视为同一个值,使用这个方法都会返回 true
2. JavaScript 采用 IEEE 754 标准,数值存储为 64 为双精度格式,数值精度最多可以达到 53 个二进制位(1个隐藏位和52个有效位),如果数值的精度超过这个限度,之后的位会被抛弃
3. 如果一个数值的绝对值小于 Number.MIN_VALUE(5E-324),即小于 JavaScript 能够分辨的最小值,会被自动转为0,

// 小数点第16位为2,被抛弃(转成二进制位超过了53个二进制位)
Number.isInterger(3.0000000000000002)  // true
// 这里的 5E-325 值太小,自动转为0,导致误判
Number.isInteger(5E-324)  // false
Number.isInteger(5E-325)  // true

5. Number.EPSILON

Number 对象上面,新增一个极小的常量 Number.EPSILON,他表示 1 与大于 1 的最小浮点数之间的差。相当于 2 的 -52 次方

Number.EPSILON === Math.pow(2, -52)  // true

其存在的意义在于,表示误差小于这个值,就可以认为没有意义,即不存在误差

这就解释的以下代码为什么会返回 false

0.1.toFixed(20)  // "0.10000000000000000555"
0.1 + 0.2 === 0.3  // fale

6. 安全整数和 Number.isSafeInteger()

JavaScript 能够准确表示的整数范围在 -2^53 到 2^53 之间(不包含两个端点),超过这个范围,无法精确表示这个值

同时 ES6 引入了 Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER 这连个常量,用来表示这个范围的上下限

Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1
// true
Number.MAX_SAFE_INTEGER === 9007199254740991
// true

Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER
// true
Number.MIN_SAFE_INTEGER === -9007199254740991

Number.isSafeInteger() 则是用来判断整个整数是否落在这个范围之内

这个函数的内部实现原理:
1. 先判断参数是否为 Number 类型
2. 之后判断参数是否为整数
3. 最后判断参数是否大于或者小于安全区间

注意:实际使用这个方法时,如果参数是一条表达式,需要运算,那可能会出现一些误差

Number.isSafeInteger(9007199254740993 - 990)
// true
9007199254740993 - 990
// 返回结果 9007199254740002
// 正确答案应该是 9007199254740003

这里因为这个数超过了精度范围,导致计算机内部,以 9007199254740002 的形式存储

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章