[ES6] 数值
- 数值的表示
- Number
- 常量 Number.EPSILON
- 安全整数
- 属性特性
- Number 对象新方法
- 方法简介
- 方法特性
- Math 对象的扩展
- 方法简介
- 方法特性
- 方法实例
数值的表示
- 二进制表示法:添加前缀 0b 或者 0B
- 八进制表示法:添加前缀 0o 或者 0O
console.log(0b11 === 3); // true
console.log(0o11 === 9); // true
Number
常量 Number.EPSILON
- Number.EPSILON 属性表示 1 与大于 1 的最小浮点数之间的差
- 该值接近于 2.2204460492503130808472633361816E-16,或者 2-52
- 属性特性
- writable:false
- enumerable:false
- configurable:false
测试数值是否在误差范围内,在误差范围内即视为相等:
0.1 + 0.2 === 0.3; // false
equal = Math.abs(0.1 - 0.3 + 0.2) < Number.EPSILON; // true
安全整数
安全整数表示在 JavaScript 中能够精确表示的整数,安全整数的范围在 2 的 -53 次方到 2 的 53 次方之间(不包括两个端点),超过这个范围的整数无法精确表示。
最大安全整数
,安全整数范围的上限,即 2 的 53 次方减 1 。
最小安全整数
,安全整数范围的下限,即 2 的 53 次方减 1 的负数。
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true
Number.MAX_SAFE_INTEGER === Number.MAX_SAFE_INTEGER + 1; // false
Number.MAX_SAFE_INTEGER - 1 === Number.MAX_SAFE_INTEGER - 2; // false
Number.MIN_SAFE_INTEGER + 1 === Number.MIN_SAFE_INTEGER + 2; // false
Number.MIN_SAFE_INTEGER === Number.MIN_SAFE_INTEGER - 1; // false
Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2; // true
属性特性
- writable:false
- enumerable:false
- configurable:false
Number 对象新方法
一些全局方法移植成 Number 对象的方法,逐步减少全局方法,用于全局变量的模块化
,但是方法的行为没有发生改变。
方法简介
方法 | 说明 |
---|---|
Number.isFinite() | 检查数值是否为有限 |
Number.isNaN() | 检查值是否为 NaN |
Number.parseInt() | 将给定字符串转化为指定进制的整数 |
Number.parseFloat() | 把字符串解析成浮点数 |
Number.isInteger() | 检查值是否为整数 |
Number.isSafeInteger() | 检查数值是否在安全范围 |
方法特性
- Number.isFinite()
- 检查数值是否为有限(finite),即不是 Infinity
- isFinate 没有隐式类型转换,所有非数值都返回 false
- Number.isNaN()
- 非 NaN 全部返回 false
- isNaN 判断前会将非数值隐式转换为数值类型
- Number.parseInt(data,number)
- 默认十进制
- parseInt 具有隐式转换为数值类型
- number 设置进程数
- 与全局 parseInt() 函数是同一个函数
- Number.parseFloat()
- 无法解析的浮点数,则返回 NaN
- 与全局 parseFloat() 函数是同一个函数
- Number.isInteger()
- NaN 和正负 Infinity 不是整数
- JavaScript 内部,整数和浮点数采用的是同样的储存方法,因此 1 与 1.0 被视为相同的值
- isInteger 没有隐式类型转换
console.log(Number.isFinite(1)); // true
console.log(Number.isFinite(0.1)); // true
console.log(Number.isFinite(NaN)); // false NaN 不是有限的
console.log(Number.isFinite(Infinity)); // false
console.log(Number.isFinite(-Infinity)); // false
console.log(Number.isFinite("foo")); // false
console.log(Number.isFinite("15")); // false
console.log(Number.isFinite(true)); // false
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("true" / 0)); // true
Number.isNaN("NaN"); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN("true"); // false
Number.parseInt("12.34"); // 12
Number.parseInt(12.34); // 12
Number.parseInt("0011", 2); //指定进制 3
Number.parseInt === parseInt; // true
Number.parseFloat("123.45"); // 123.45
Number.parseFloat("123.45abc"); // 123.45
Number.parseFloat("abc"); // NaN-无法解析的浮点数,则返回 NaN
Number.parseFloat === parseFloat; // true
Number.isInteger(0); // true
// JavaScript 中整数和浮点数是同样的储存方法,因此 1 与 1.0 被视为相同的值
Number.isInteger(1); // true
Number.isInteger(1.0); // true
Number.isInteger(1.1); // false
Number.isInteger(Math.PI); // false
Number.isInteger(NaN); // false
Number.isInteger(Infinity); // false
Number.isInteger(-Infinity); // false
Number.isInteger("10"); // false
Number.isInteger(true); // false
Number.isInteger(false); // false
Number.isInteger([1]); // false
// 数值的精度超过 53 个二进制位时,由于第 54 位及后面的位被丢弃,会产生误判
Number.isInteger(1.0000000000000001); // true
// 一个数值的绝对值小于 Number.MIN_VALUE(5E-324),即小于 JavaScript 能够分辨的最小值,会被自动转为 0,也会产生误判
Number.isInteger(5e-324); // false
Number.isInteger(5e-325); // true
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1); // false
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1); // false
Math 对象的扩展
ES6 在 Math 对象上新增了 17 个数学相关的静态方法,这些方法只能在 Math 中调用
方法简介
方法 | 说明 |
---|---|
普通计算 | |
Math.cbrt() | 计算一个数的立方根 |
Math.imul() | 检查值是否为 NaN |
Math.hypot() | 计算所有参数平方和的平方根 |
Math.clz32() | 返回 32 位无符号整数形式的前导 0 的个数 |
数字处理 | |
Math.trunc() | 用于返回数字的整数部分 |
Math.fround() | 获取 32 位单精度浮点数形式 |
判断 | |
Math.sign | 判断数字的符号(正、负、0) |
对数方法 | |
Math.expm1() | 计算 e 的 x 次方减 1,= Math.exp(x) - 1 |
Math.log1p(x) | 计算 1 + x 的自然对数,=Math.log(1 + x) |
Math.log10(x) | 计算以 10 为底 x 的对数 |
Math.log2() | 用于计算 2 为底 x 的对数 |
双曲函数方法 | |
Math.sinh(x) | 用于计算双曲正弦 |
Math.cosh(x) | 用于计算双曲余弦 |
Math.tanh(x) | 用于计算双曲正切 |
Math.asinh(x) | 用于计算反双曲正弦 |
Math.acosh(x) | 用于计算反双曲余弦 |
Math.atanh(x) | 用于计算反双曲正切 |
指数运算符 | **,右结合计算 |
**= | 类似于+= |
方法特性
- Math.cbrt
- 支持隐式转换为数值类型
- 无法转换的类型返回 NaN
- Math.imul
- 两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数
- Math.hypot
- 支持隐式转换为数值类型
- 无法转换的类型返回 NaN
- Math.clz32
- 支持隐式转换为数值类型
- 数值小数时向下取整
- Math.trunc
- 支持隐式转换为数值类型
- 空值或无法转换的类型返回 NaN
- 区分正负
- Math.expm1
- 支持隐式转换为数值类型
- 无法转换为数值类型返回 NaN
- Math.log1p(x)
- 计算的是 x+1 的自然对数,底数为 E
- x< -1 时返回 NaN
方法实例
Math.cbrt(1); // 1
Math.cbrt(0); // 0
Math.cbrt(-1); // -1
Math.cbrt("1"); // 1
Math.cbrt("hhh"); // NaN
// 大多数情况下,结果与 a \* b 相同
Math.imul(1, 2); // 2
// 用于正确返回大数乘法结果中的低位数值
Math.imul(0x7fffffff, 0x7fffffff); // 1
Math.hypot(3, 4); // 5
// 非数值会先被转换为数值后进行计算
Math.hypot(1, 2, "3"); // 3.741657386773941
Math.hypot(true); // 1
Math.hypot(false); // 0
// 空值会被转换为 0
Math.hypot(); // 0
Math.hypot([]); // 0
// 参数为 Infinity 或 -Infinity 返回 Infinity
Math.hypot(Infinity); // Infinity
Math.hypot(-Infinity); // Infinity
// 参数中存在无法转换为数值的参数时返回 NaN
Math.hypot(NaN); // NaN
Math.hypot(3, 4, "foo"); // NaN
Math.hypot({}); // NaN
Math.clz32(0); // 32
Math.clz32(1); // 31
Math.clz32(0b01000000000100000000000000000000); // 1
Math.clz32(0.5); // 32
// 对于空值或非数值,会转化为数值再进行计算
Math.clz32("1"); // 31
Math.clz32(); // 32
Math.clz32([]); // 32
Math.clz32({}); // 32
Math.clz32(NaN); // 32
Math.clz32(Infinity); // 32
Math.clz32(-Infinity); // 32
Math.clz32(undefined); // 32
Math.clz32("hhh"); // 32
Math.trunc(12.3); // 12
Math.trunc(12); // 12
// 整数部分为 0 时也会判断符号
Math.trunc(-0.5); // -0
Math.trunc(0.5); // 0
Math.trunc("12.3"); // 12
// 空值或无法转化为数值时时返回 NaN
Math.trunc(); // NaN
Math.trunc(NaN); // NaN
Math.trunc("hhh"); // NaN
Math.trunc("123.2hhh"); // NaN
// 对于 2 的 24 次方取负至 2 的 24 次方之间的整数(不含两个端点),返回结果与参数本身一致
Math.fround(-(2**24)+1); // -16777215
Math.fround(2 ** 24 - 1); // 16777215
// 用于将 64 位双精度浮点数转为 32 位单精度浮点数
Math.fround(1.234) // 1.125
// 当小数的精度超过 24 个二进制位,会丢失精度
Math.fround(0.3); // 0.30000001192092896
Math.fround(NaN) // NaN
Math.fround(Infinity) // Infinity
// 参数为其他非数值类型时会将参数进行转换
Math.fround('5'); // 5
Math.fround(true); // 1
Math.fround(null); // 0
Math.fround([]); // 0
Math.fround({}); // NaN
Math.sign(1); // 1
Math.sign(-1); // -1
// 参数为 0 时,不同符号的返回不同
Math.sign(0); // 0
Math.sign(-0); // -0
// 判断前会对非数值进行转换
Math.sign('1'); // 1
Math.sign('-1'); // -1
// 参数为非数值(无法转换为数值)时返回 NaN
Math.sign(NaN); // NaN
Math.sign('hhh'); // NaN
Math.expm1(1); // 1.718281828459045
Math.expm1(0); // 0
Math.expm1(-1); // -0.6321205588285577
Math.expm1('0'); //0
Math.expm1(NaN); // NaN
Math.log1p(1); // 0.6931471805599453
Math.log1p(0); // 0//计算1的自然对数
Math.log1p(-1); // -Infinity
Math.log1p(-2); // NaN
Math.log10(1); // 0
// 计算前对非数值进行转换
Math.log10('1'); // 0
// 参数为 0 时返回 -Infinity
Math.log10(0); // -Infinity
// 参数小于 0 或参数不为数值(且无法转换为数值)时返回 NaN
Math.log10(-1); // NaN
Math.log2(1); // 0
// 计算前对非数值进行转换
Math.log2('1'); // 0
// 参数为 0 时返回 -Infinity
Math.log2(0); // -Infinity
// 参数小于 0 或参数不为数值(且无法转换为数值)时返回 NaN
Math.log2(-1); // NaN
1 ** 2; // 1
// 右结合,从右至左计算
2 ** 2 ** 3; // 256
// **=
let exam = 2;
exam \*\* = 2; // 4