6 数值的扩展(ECMAScript6入门)

6.1 二进制和八进制表示法

进制 前缀 支持情况
二进制 0b(0B) es6+
八进制 0o(0O) es6+
八进制 0 es5(非严格模式)
十六进制 0x(0X) es5+
1
2
// 使用 Number 将二进制和八进制字符串转为 10 进制
Number('ob111')// 7

6.2 Number.isFinite(), Number.isNaN()

6.2.1 基础

方法 说明 参数为非数字时 兼容性
isFinate 检查是否非无穷 通过 Number 转为数字,再判断 es3+
isNaN 检查是否非数字 通过 Number 转为数字,再判断 es3+
Number.isFinate 检查是否非无穷 返回 false es6+
Number.isNaN 检查是否非数字 返回 false es7+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false

Number.isNaN(NaN) // true
Number.isNaN(15) // false
Number.isNaN('15') // false
Number.isNaN(true) // false
Number.isNaN(9/NaN) // true
Number.isNaN('true'/0) // true
Number.isNaN('true'/'true') // true


isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false

isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false

6.2.2 es5环境下的polyfill

借助传统的 isNaNisFinate来实现自定义的Number.isNaNNumber.isFinate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(function (global) {
const global_isFinite = global.isFinite
const global_isNaN = global.isNaN
Object.defineProperty(Number, 'isFinite', {
value: function isFinite(value) {
return typeof value === 'number' && global_isFinite(value)
},
configurable: true,
enumerable: false,
writable: true
})

Object.defineProperty(Number, 'isNaN', {
value: function isNaN(value) {
return typeof value === 'number' && global_isNaN(value)
},
configurable: true,
enumerable: false,
writable: true
})
})(window);

6.3 Number.parseInt(), Number.parseFloat()

ES6将parseInt()parseFloat()移植到 Number对象上面。

1
2
3
4
5
6
7
8
9
10
// ES5的写法
parseInt('12.34') // 12
parseFloat('123.45#') // 123.45

// ES6的写法
Number.parseInt('12.34') // 12
Number.parseFloat('123.45#') // 123.45

Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true

这样处理的目的是逐步减少全局性方法,使得语言逐步模块化。

6.4 Number.isInteger()

功能:用来判断一个值是否为整数
注意:整数和浮点数存储方式是一样的,3和3.0都会被认为是整数

6.4.1 基础

1
2
3
4
5
Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false

6.4.2 es5环境下的 polyfill

1
2
3
4
5
6
7
8
9
10
11
12
(function (global) {
const floor = Math.floor,
isFinite = global.isFinite;
Object.defineProperty(Number, 'isInteger', {
value: function isInteger(value) {
return typeof value === 'number' && isFinite(value) && value > -9007199254740992 && value < 9007199254740992 && floor(value) === value;
},
configurable: true,
enumerable: false,
writable: true
})
})(window)

6.5 Number.EPSILON

说明:一个极小的常量2.220446049250313e-16
用途:可以在浮点数计算中作为误差范围使用

1
2
3
4
5
6
7
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON;
}
withinErrorMargin(0.1 + 0.2, 0.3)
// true
withinErrorMargin(0.2 + 0.2, 0.3)
// false

6.6 安全整数和 Number.isSafeInteger()

常量(ES6提供) 说明
Number.MAX_SAFE_INTEGER JS支持的整数上限(9007199254740991)
Number.MIN_SAFE_INTEGER JS支持的整数下限(-9007199254740991)

6.6.1 Number.isSafeInteger()

功能:判断一个整数是否落在这个JS能够支持的范围之内
技巧:验证运算结果是否落在安全整数的范围內,不要只验证运算结果,而要同时验证参与运算的每个值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Number.isSafeInteger('a') // false
Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false

Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(9007199254740990) // true
Number.isSafeInteger(9007199254740992) // 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 检验 操作数 和 操作结果 的是否为安全整数,以确保运算过程正确
* @param {number} left 左操作数
* @param {number} right 右操作数
* @param {number} result 结果
* @return {number} 结果
*/

function trusty (left, right, result) {
if (
Number.isSafeInteger(left) &&
Number.isSafeInteger(right) &&
Number.isSafeInteger(result)
) {
return result;
}
throw new RangeError('Operation cannot be trusted!');
}

trusty(9007199254740993, 990, 9007199254740993 - 990)// RangeError: Operation cannot be trusted!
trusty(1, 2, 3)// 3

6.6.2 es5 环境下的 polyfill

1
2
3
4
5
6
7
8
9
/**
* es5 环境下的 polyfill
*/

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

6.7 Math 对象的扩展

es6在 Math 对象上新增了17个与数学相关的静态方法

6.7.1 常用(7个)

静态方法 说明
Math.truc 去除一个数的小数部分
Math.sign 判断一个数到底是正数、负数、还是零
Math.cbrt 计算一个数的立方根
Math.clz32 返回一个数的32位无符号整数形式有多少个前导0
Math.imul 返回两个数以32位带符号整数形式相乘的结果
Math.fround 返回一个数的单精度浮点数形式
Math.hypot 返回所有参数的平方和的平方根

6.7.2 对数方法(4个)

静态方法 说明
Math.expm1 返回e^x - 1. 即 Math.exp(x) - 1
Math.log1p 返回 1 + x 的自然对数,即 Math.log(1 + x)
Math.log10 返回 以10为底的 x 的对数
Math.log2 返回 以2为底的 x 的对数

6.7.3 三角函数方法(6个)

静态方法 说明

Math.sinh(x)返回 x 的双曲正弦
Math.cosh(x)返回 x 的双曲余弦
Math.tanh(x)返回 x 的双曲正切
Math.asinh(x)返回 x 的反双曲正弦
Math.aconsh(x)返回 x 的反双曲余弦
Math.atanh(x)返回 x 的反双曲正切

6.8 指数运算符

运算符 说明
** 指数运算符
**= 指数运算和等号结合
1
2
3
4
5
6
7
8
2 ** 2// 4
2 ** 3// 8

let a = 2;
a **= 2;// 等同于 a = a * a

let b = 3;
b **= 3;// 等同于 b = b * b * b;