二进制和八进制表示法
以0b/0o为前缀的字符串,必须使用Number
方法
Number.isFinite(), Number.isNaN()
返回值 :true/false
Number.isFinite():检验 数值 是否为有限数
Number.isNaN():检查 数值 是否为NaN
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite('0.8'); // false
Number.isNaN(NaN) // true
Number.isNaN(15) // false
Number.isNaN('true' / 0) // true
Number.parseInt(), Number.parseFloat()
作用 :逐步减少全局性方法,使得语言逐步模块化
返回值 :数值
Number.parseInt() :获取数值的整数部分
Number.parseFloat() :获取数值的整数及小数部分
Number.parseInt === parseInt
Number.parseFloat === parseFloat
Number.isInteger()
作用 :判断一个 数值 是否为整数
返回值 :true/false
注意点 :
Number.MIN_VALUE
(5E-324),则自动转为0Number.isInteger(25) // true
Number.isInteger(25.1) // false
Number.isInteger(true) // false
Number.isInteger(3.0000000000000002) // true
Number.isInteger(5E-324) // false
Number.isInteger(5E-325) // true
Number.EPSILON
作用 :JavaScript 能够表示的最小精度。若误差小于该值,即不存在误差
表示 :能够接受的误差范围
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
安全整数和 Number.isSafeInteger()
es6引入了Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
两个常量来表示js能准确表示的范围
Number.isSafeInteger() :判断 整数 是否在该范围内
注意点 :验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值
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
Math 对象的扩展
方法 | 作用 | 举例 |
---|---|---|
Math.trunc() | 去除一个数的小数部分,返回整数部分 | Math.trunc(-4.9) // -4 Math.trunc(false) // 0 |
Math.sign() | 判断一个数到底是正数、负数、还是零 | Math.sign(true) // +1 Math.sign() // NaN |
Math.cbrt() | 计算一个数的立方根 | Math.cbrt('hello') // NaN Math.cbrt('8') // 2 |
Math.clz32() | 将参数转为 32 位无符号整数的形式,然后这个 32 位值里面有多少个前导 0 | 左移运算符(<<)与Math.clz32方法直接相关 |
Math.imul() | 两个数以 32 位带符号整数形式相乘的结果 | |
Math.fround() | 返回一个数的32位单精度浮点数形式 | |
Math.hypot() | 返回所有参数的平方和的平方根 | |
Math.expm1() | e x − 1 e^{x}-1 ex−1 | 等同于Math.exp(x) - 1 |
Math.log1p() | loge(x+1) | 等同于Math.log(1 + x) |
Math.log10() | log10(x+1) | |
Math.log2() | log2(x+1) | |
Math.sinh(x) | ||
Math.cosh(x) | ||
Math.tanh(x) | ||
Math.asinh(x) | ||
Math.acosh(x) | ||
Math.atanh(x) | ||
** | 右结合,从最右边开始计算 | 2 ** 3 ** 2 =2 ** (3 ** 2) =512; b **= 3=b * b * b |
Math.trunc()的作用
对于不支持的环境可以一下代码模拟:
Math.trunc = Math.trunc || function(x) {
return x < 0 ? Math.ceil(x) : Math.floor(x);
};
Math.trunc() 与Number.parseInt() 的区别
Math.sign()的返回值:
Math.sign()的作用 :对于数值,直接判断,对于非数值,先转换为数值
对于不支持的环境可以一下代码模拟:
Math.sign = Math.sign || function(x) {
x = +x; // convert to a number
if (x === 0 || isNaN(x)) {
return x;
}
return x > 0 ? 1 : -1;
};
Math.cbrt()的作用 :先使用Number方法将其转为数值
对于不支持的环境可以一下代码模拟:
Math.cbrt = Math.cbrt || function(x) {
var y = Math.pow(Math.abs(x), 1/3);
return x < 0 ? -y : y;
};