前言
本章介绍数值的扩展。新增了很多方法,有些不常用的方法了解即可。 本章原文链接:数值的扩展
进制表示法
ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b (或0B )和0o (或0O )表示。 八进制就不再允许使用前缀0 表示。 0b 和0o 前缀的字符串数值转为十进制,要使用Number 方法。
console.log(Number('0b10'));
console.log(Number('0o10'));
数值分隔符
ES2021,允许 JavaScript 的数值使用**下划线(_)**作为分隔符。 数值分隔符主要为了书写数值时增加数值的可读性,不是为了处理外部输入的数据,对于 JavaScript 内部数值的存储和输出,并没有影响。
注意:
- 不能放在数值的最前面(
leading )或最后面(trailing )。 - 不能两个或两个以上的分隔符连在一起。
- 小数点的前后不能有分隔符。
- 科学计数法里面,表示指数的
e 或E 前后不能有分隔符。 - 分隔符不能紧紧跟着进制的前缀
- 字符串转数值的一些操作方法不支持数值分隔符
其它进制也能使用数值分隔符
const sample10 = 1000_1000_1000;
const sample2 = 0b1000_1000;
const sample8 = 0o1000_1000;
console.log(sample10);
console.log(sample2);
console.log(sample8);
注意:Number()、parseInt()、parseFloat()不支持数字分隔符
数值的方法
Number.isFinite(), Number.isNaN()
ES6 在Number对象上,新提供了Number.isFinite() 和Number.isNaN() 两个方法。
Number.isFinite() 用来检查一个数值是否为有限的数字(finite ),即不是Infinity 。Number.isNaN() 用来检查一个数值是否为NaN。
注意: 两个新方法与之前全局方法isFinite 、isNaN 有什么不同呢?
- 而这两个新方法只对数值有效,
- 传统方法先调用
Number() 将非数值的值转为数值,再进行判断,
isFinite(25)
isFinite("25")
Number.isFinite(25)
Number.isFinite("25")
Number.isFinite(Infinity);
Number.isFinite(-Infinity);
isNaN(NaN)
isNaN("NaN")
Number.isNaN(NaN)
Number.isNaN("NaN")
Number.parseInt(), Number.parseFloat()
ES6 将全局方法parseInt() 和parseFloat() ,移植到Number 对象上面,行为完全保持不变。主要是用于全局变量的模块化
parseInt() 函数解析字符串并返回整数。parseFloat() 函数解析字符串并返回浮点数。
const sampleInt = parseInt('11.11');
const sampleFloat = parseFloat('1a2b3c');
const sampleInt1 = Number.parseInt('11.11');
const sampleFloat1 = Number.parseFloat('1a2b3c');
console.log(sampleInt, sampleFloat);
console.log(sampleInt1, sampleFloat1);
Number.isInteger()
Number.isInteger() 方法用来判断给定的参数是否为整数。
注意:
- 由于整数和浮点数采用的是同样的储存方法,所以 4 和 4.0 被视为同一个值。都为整数
- 参数需要为数值,参数不是数值,
Number.isInteger() 直接返回false 。 - 由于 JavaScript 数值精度最多可以达到 53 个二进制位,如果数值的精度超过这个限度,第54位及后面的位就会被丢弃,会导致
Number.isInteger 可能会误判。绝对值也是如此。
const sample1 = Number.isInteger(44);
const sample2 = Number.isInteger(44.00);
const sample3 = Number.isInteger('44');
const sample4 = Number.isInteger(44.0000000000000000987654321);
console.log(sample1, sample2, sample3, sample4);
数值新增常量
Number.EPSILON
ES6 在Number 对象上面,新增一个极小的常量Number.EPSILON 。它表示 1 与大于 1 的最小浮点数之间的差。 对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的1.00..001 (小数点后面有连续 51 个零),这个值减去 1 之后,就等于 2 的 -52 次方。 Number.EPSILON 实际上是 JavaScript 能够表示的最小精度。 Number.EPSILON 实质是一个可以接受的最小误差范围。
const sample = Number.EPSILON === Math.pow(2, -52);
console.log(sample);
const sample1 = Number.EPSILON;
console.log(sample1);
const sample2 = Number.EPSILON.toFixed(20);
console.log(sample2);
安全整数和 Number.isSafeInteger()
JavaScript 能够准确表示的整数范围在-253到253之间(不含两个端点),超过这个范围,无法精确表示这个值。 ES6 引入了Number.MAX_SAFE_INTEGER 和Number.MIN_SAFE_INTEGER 这两个常量,用来表示-2^53到2^53 上下限。
const sample = Number.MAX_SAFE_INTEGER === 9007199254740991;
const sample1 = Number.MIN_SAFE_INTEGER === -Number.MAX_SAFE_INTEGER;
const sample2 = Number.MIN_SAFE_INTEGER === -9007199254740991;
console.log(sample,sample1,sample2);
Number.isSafeInteger() 用来判断一个整数是否落在这个范围之内,对于非整数,全部返回false ?
const sample = Number.isSafeInteger(44);
const sample1 =Number.isSafeInteger(44.001);
const sample3 =Number.isSafeInteger(9007199254740990);
const sample3 =Number.isSafeInteger(9007199254740992);
console.log(sample,sample1,sample2,sample3);
Math 对象的扩展
ES6 在 Math 对象上新增了 17 个与数学相关的方法。 所有这些方法都是静态方法,只能在 Math 对象上调用。
- Math.trunc() - 取整。
- Math.sign() - 判断数字是正数、负数、还是零。
- Math.cbrt() - 计算一个数的立方根
- Math.clz32() - 计算一个数的 32 位二进制形式的前导 0 的个数 。
- Math.imul() - 计算两个参数的类 C 32 位乘法的。
- Math.fround() - 返回一个数的32位单精度浮点数形式。
- Math.hypot() - 返回所有参数的平方和的平方根。
- Math.expm1() - 返回 ex - 1,x为参数
- Math.log1p() - 返回参数 + 1 后的自然对数
- Math.log10() - 返回以 10 为底的参数对数
- Math.log2() - 返回以 2 为底的参数对数
- Math.sinh() - 函数返回一个数字(单位为角度)的双曲正弦值。
- Math.cosh() - 函数返回数值的双曲余弦函数。
- Math.tanh() - 函数将会返回一个数的双曲正切函数值。
- Math.asinh() - 函数返回给定数字的反双曲正弦值。
- Math.acosh() - 返回一个数字的反双曲余弦值。
- Math.atanh() - 函数返回一个数值反双曲正切值。
Math.trunc()
Math.trunc() 方法会将数字的小数部分去掉,只保留整数部分,是一个取整操作。 Math 中有三个方法: Math.floor() 、Math.ceil() 、Math.round() ,也是用于取整操作。
Math.floor() 向下取整;Math.ceil() 向上取整;Math.round() 进行四舍五入操作。Math.trunc() 去除小数部分,只保留整数部分。
const sample = Math.trunc(4.9);
const sample1 = Math.trunc('4.4');
const sample2 = Math.trunc('12.a');
console.log(sample, sample1,sample2);
Math.sign()
Math.sign() 判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。 5种返回值, 分别是 1, -1, 0, -0, NaN . 代表的各是正数, 负数, 正零, 负零, NaN 。
- 参数为正数,返回**+1**;
- 参数为负数,返回**-1**;
- 参数为 0,返回0;
- 参数为**-0**,返回**-0**;
- 其他值,返回NaN。
const sample = Math.sign(-4);
const sample1 = Math.sign(4);
const sample2 = Math.sign(0);
const sample3 = Math.sign(-0);
const sample4 = Math.sign('a');
console.log(sample, sample1, sample2, sample3, sample4);
Math.cbrt()
在数学上 : 如果x3=a,那么x叫做a的立方根。 Math.cbrt() 计算一个数的立方根
const sample = Math.cbrt(-1);
const sample1 = Math.cbrt(8);
const sample2 = Math.cbrt(0);
const sample3 = Math.cbrt(-0);
const sample4 = Math.cbrt('a');
console.log(sample, sample1, sample2, sample3, sample4);
Math.clz32()
Math.clz32() 函数返回参数转化为 32 位无符号整数数字二进制 开头的 0 的个数, 对于空值或其他类型的值,Math.clz32 方法会将它们先转为数值,然后再计算。
注意
Math.clz32() 对于小数,只考虑整数部分<< 运算符把 【要位移的数字】 的所有位向左移 【位移位数】 指定的位数。- result =【要位移的数字】 << 【位移位数】
const sample = Math.clz32();
const sample1 = Math.clz32(1 << 29);
const sample2 = Math.clz32(44.7);
const sample3 = Math.clz32(true);
const sample4 = Math.clz32('a');
console.log(sample, sample1, sample2, sample3, sample4);
Math.imul()
Math.imul() 方法将两个参数分别转换为 32 位整数,相乘后返回 32 位的带符号整数。 JavaScript 有精度限制,使得超过 2 的 53 次方的值无法精确表示。Math.imul() 方法可以返回正确的低位数值。
const sample = Math.imul(-1, 8.9);
const sample1 = Math.imul(0xffffffff, 5);
const sample2 = Math.imul(0x7fffffff, 0x7fffffff);
console.log(sample, sample1, sample2);
Math.fround()
Math.fround() 可以将任意的数字转换为32位单精度浮点数形式。 JavaScript 内部使用64位的双浮点数字,支持很高的精度。对于32位单精度格式来说,数值精度是24个二进制位(1 位隐藏位与 23 位有效位)
注意
- 如果参数的绝对值大于224,返回的结果便开始丢失精度。
- 对于
NaN 和 Infinity ,此方法返回原值 - 对于其它非数值,
Math.fround 方法先将其转为数值,再返回单精度浮点数。
const sample = Math.fround(99);
const sample1 = Math.fround(0.7);
const sample2 = Math.fround('5');
const sample3 = Math.fround(Infinity);
console.log(sample, sample1, sample2, sample3);
Math.hypot()
Math.hypot() 函数返回所有参数的平方和的平方根。
const sample = Math.hypot(3, 4);
const sample1 = Math.hypot();
const sample2 = Math.hypot('-9');
const sample3 = Math.hypot(Infinity);
const sample4 = Math.hypot(1, 2, 'a');
console.log(sample, sample1, sample2, sample3, sample4);
对数方法
Math.expm1()
Math.expm1() 返回 ex - 1,即Math.exp(x) - 1 其中 x 是该函数的参数, e 是自然对数的底数
const sample = Math.expm1(-38);
const sample1 = Math.expm1(0);
const sample2 = Math.expm1(1);
const sample3 = Math.expm1('a');
console.log(sample, sample1, sample2, sample3);
Math.log1p()
Math.log1p() 方法返回参数** + 1** 后的自然对数,(底为 e),即Math.log(1 + x) 。
const sample = Math.log1p(-2);
const sample1 = Math.log1p(-1);
const sample2 = Math.log1p(0);
const sample3 = Math.log1p('a');
console.log(sample, sample1, sample2, sample3);
Math.log10()
Math.log10() 返回以 10 为底的参数对数
const sample = Math.log10(-2);
const sample1 = Math.log10(1);
const sample2 = Math.log10('10');
const sample3 = Math.log10('a');
console.log(sample, sample1, sample2, sample3);
Math.log2()
Math.log10() 和 Math.log2() 类似,一个以 10 为底,一个以 2 为底 Math.log2() 返回以 2 为底的参数对数
const sample = Math.log2(-2);
const sample1 = Math.log2(1);
const sample2 = Math.log2('1024');
const sample3 = Math.log2('a');
console.log(sample, sample1, sample2, sample3);
双曲函数方法
ES6 新增了 6 个双曲函数方法。
Math.sinh() 函数返回一个数字(单位为角度)的双曲正弦值。Math.cosh() 函数返回数值的双曲余弦函数, 可用constant e表示。Math.tanh() 函数将会返回一个数的双曲正切函数值。Math.asinh() 函数返回给定数字的反双曲正弦值。Math.acosh() 返回一个数字的反双曲余弦值。Math.atanh() 函数返回一个数值反双曲正切值。
BigInt 数据类型
描述
ES2020 引入了一种新的数据类型 BigInt ,这是 ECMAScript 的第八种数据类型。 BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。 BigInt 数据类型的目的是比Number 数据类型支持的范围更大的整数值。
注意
- BigInt 也可以使用各种进制表示,都要加上后缀 **n **。
- BigInt 与Number 数值的类型不同。
- BigInt 除一元加号(+)运算符外,BigInt 可以使用所有运算符。
- BigInt 也可以转化为其它数据类型。
- BigInt 不能与普通数值进行混合运算。
const sample = 99999999999999999999n;
const sample1 = 999n + 999n * 99n / 99n - 99n;
const sample2 = 0o777n + 0b1101n;
const sample3 = String(1n);
console.log(sample);
console.log(sample1);
console.log(sample2);
console.log(sample3);
const sample4 = 10n + 10;
BigInt 函数
JavaScript 原生提供 BigInt 函数,将其他类型的值转为 BigInt 类型。 与 Number() 一致
注意
- 参数不能为空。
- 参数不能为小数。
- 参数必须能正常转化为数值。
const sample = BigInt(44);
const sample1 = BigInt('490');
console.log(sample);
console.log(sample1);
const sample2 = BigInt(undefined);
const sample3 = BigInt('44a');
const sample4 = BigInt(1.1);
const sample5 = BigInt();
|