ES6 数值的扩展(十八)

1. 二进制和八进制字面量

特性:可以直接在代码中使用二进制(0b 或 0B)和八进制(0o 或 0O)字面量。

用法:简化二进制和八进制数值的表示。

bash 复制代码
const binaryNumber = 0b1010; // 二进制表示 10
const octalNumber = 0o12;    // 八进制表示 10
console.log(binaryNumber);   // 输出:10
console.log(octalNumber);     // 输出:10

2. Number.isFinite()

Number.isFinite()用来检查一个数值是否为有限的(finite),即不是 Infinity 。

特性:判断一个值是否是有限数值。

用法:检查一个数值是否是有限的。

bash 复制代码
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

3. Number.isNaN()

Number.isNaN() 用来检查一个值是否为NaN。

特性:判断一个值是否是 NaN。

用法:区分 NaN 和其他非数值。

bash 复制代码
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
//如果参数类型不是 NaN , Number.isNaN 一律返回 false 

它们与传统的全局方法 isFinite() 和 isNaN() 的区别在于,传统方法先调用 Number()

将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效, Number.isFinite() 对于非数值一律返回 false ,Number.isNaN() 只有对于NaN才返回true ,非 NaN 一律返回 false 。

4. Number.parseInt() 和 Number.parseFloat()

ES6 将全局方法 parseInt() 和 parseFloat(),移植到 Number 对象上面,行为完全保持不变。

特性:Number.parseInt 被重新定义为与全局的 parseInt 一致,Number.parseFloat 被重新定义为与全局的 parseFloat 一致。

用法:解析字符串为整数或浮点数。

bash 复制代码
// 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

5. Math 对象的扩展

ES6 在Math 对象上新增了 17个与数学相关的方法。所有这些方法都是静态方法,只能在 Math 对象上调用。

特性:Math 对象增加了一些新的静态方法,如 Math.trunc()、Math.sign()、Math.cbrt() 等。

用法:提供更多的数学运算功能。

  • Math.trunc() //用于去除一个数的小数部分,返回整数部分。
bash 复制代码
Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4
Math.trunc(-0.1234) // -0
Math.trunc(NaN);      // NaN
Math.trunc('foo');    // NaN
Math.trunc();         // NaN
Math.trunc(undefined) // NaN

它会返回五种值。

参数为正数,返回 +1 ;

参数为负数,返回 -1 ;

参数为 0,返回 0 ;

参数为-0,返回 -0 ;

其他值,返回 NaN 。
Math.sign(-5) // -1

Math.sign(5) // +1

Math.sign(0) // +0

Math.sign(-0) // -0

Math.sign(NaN) // NaN

Math.sign('') // 0

Math.sign(true) // +1

Math.sign(false) // 0

Math.sign(null) // 0

Math.sign('9') // +1

Math.sign('foo') // NaN

Math.sign() // NaN

Math.sign(undefined) // NaN

  • Math.cbrt() //用于计算一个数的立方根
bash 复制代码
Math.cbrt(-1) // -1
Math.cbrt(0)  // 0
Math.cbrt(1)  // 1
Math.cbrt(2)  // 1.2599210498948732
Math.cbrt('8') // 2
Math.cbrt('hello') // NaN

对于没有部署这个方法的环境,可以用下面的代码模拟。

bash 复制代码
Math.cbrt = Math.cbrt || function(x) {
  var y = Math.pow(Math.abs(x), 1/3);
  return x < 0 ? -y : y;
};
  • Math.clz32() //Math.clz32() 方法将参数转为 32 位无符号整数的形式,然后返回这个 32 位值里面有多少个前导 0。
bash 复制代码
Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1000) // 22
Math.clz32(0b01000000000000000000000000000000) // 1
Math.clz32(0b00100000000000000000000000000000) // 2

Math.clz32(0) // 32
Math.clz32(1) // 31
Math.clz32(1 << 1) // 30
Math.clz32(1 << 2) // 29
Math.clz32(1 << 29) // 2

Math.clz32(3.2) // 30
Math.clz32(3.9) // 30

Math.clz32() // 32
Math.clz32(NaN) // 32
Math.clz32(Infinity) // 32
Math.clz32(null) // 32
Math.clz32('foo') // 32
Math.clz32([]) // 32
Math.clz32({}) // 32
Math.clz32(true) // 31
bash 复制代码
Math.imul(2, 4)   // 8
Math.imul(-1, 8)  // -8
Math.imul(-2, -2) // 4

(0x7fffffff * 0x7fffffff)|0 // 0

上面这个乘法算式,返回结果为 0。但是由于这两个二进制数的最低位都是 1,所以这个结果肯定是不正确的,因为根据二进制乘法,计算结果的二进制最低位应该也是 1。这个错误就是因为它们的乘积超过了 2 的 53 次方,JavaScript 无法保存额外的精度,就把低位的值都变成了 0。 Math.imul 方法可以返回正确的值 1。

bash 复制代码
Math.imul(0x7fffffff, 0x7fffffff) // 1
  • Math.fround() //Math.fround 方法返回一个数的32位单精度浮点数形式。
bash 复制代码
Math.fround(0)   // 0
Math.fround(1)   // 1
Math.fround(2 ** 24 - 1)   // 16777215

// 未丢失有效精度
Math.fround(1.125) // 1.125
Math.fround(7.25)  // 7.25
// 丢失精度
Math.fround(0.3)   // 0.30000001192092896
Math.fround(0.7)   // 0.699999988079071
Math.fround(1.0000000123) // 1

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.fround = Math.fround || function (x) {
  return new Float32Array([x])[0];
};
bash 复制代码
Math.hypot(3, 4);        // 5
Math.hypot(3, 4, 5);     // 7.0710678118654755
Math.hypot();            // 0
Math.hypot(NaN);         // NaN
Math.hypot(3, 4, 'foo'); // NaN
Math.hypot(3, 4, '5');   // 7.0710678118654755
Math.hypot(-3);          // 3

6. Number.isInteger()

Number.isInteger()用来判断一个数值是否为整数。

bash 复制代码
Number.isInteger(25) // true
Number.isInteger(25.1) // false

Number.isInteger(25) // true
Number.isInteger(25.0) // true

Number.isInteger() // false
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // false

Number.isInteger(3.0000000000000002) // true

Number.isInteger(5E-324) // false
Number.isInteger(5E-325) // true

7. Number.EPSILON

ES6 在 Number 对象上面,新增一个极小的常量Number.EPSILON。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。

对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的 1.00...001 ,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的 -52 次方。

bash 复制代码
Number.EPSILON === Math.pow(2, -52)
// true
Number.EPSILON
// 2.220446049250313e-16
Number.EPSILON.toFixed(20)
// "0.00000000000000022204"

0.1 + 0.2
// 0.30000000000000004
0.1 + 0.2 - 0.3
// 5.551115123125783e-17
5.551115123125783e-17.toFixed(20)
// '0.00000000000000005551'
0.1 + 0.2 === 0.3 // false
bash 复制代码
5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2)
// true

// Number.EPSILON 的实质是一个可以接受的最小误差范围
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
1.1 + 1.3 === 2.4 // false
withinErrorMargin(1.1 + 1.3, 2.4) // true

Number.EPSILON 实际上是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的。

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

特性:判断一个值是否是安全整数,即在 -(2^53 - 1) 到 2^53 - 1 之间的整数。

用法:检查一个数值是否是安全整数。

bash 复制代码
console.log(Number.isSafeInteger(10));       // 输出:true
console.log(Number.isSafeInteger(2 ** 53));   // 输出:false
console.log(Number.isSafeInteger(NaN));      // 输出:false
bash 复制代码
Math.pow(2, 53) // 9007199254740992
9007199254740992  // 9007199254740992
9007199254740993  // 9007199254740992
Math.pow(2, 53) === Math.pow(2, 53) + 1
// true
// 上面代码中,超出 2 的 53 次方之后,一个数就不精确了。
// ES6 引入了Number.MAX_SAFE_INTEGER和 Number.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
// true

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

bash 复制代码
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

7. BigInt 类型

JavaScript 原生提供 BigInt 对象,可以用作构造函数生成 BigInt 类型的数值。转换规则基本与 Number() 一致,将其他类型的值转为 BigInt。

特性:提供了一种可以安全表示和操作大整数的数据类型。

用法:处理超过传统 Number 范围的整数。

bash 复制代码
BigInt(123) // 123n
BigInt('123') // 123n
BigInt(false) // 0n
BigInt(true) // 1n

new BigInt() // TypeError
BigInt(undefined) //TypeError
BigInt(null) // TypeError
BigInt('123n') // SyntaxError
BigInt('abc') // SyntaxError

BigInt(1.5) // RangeError
BigInt('1.5') // SyntaxError

const max = 2n ** (64n - 1n) - 1n;
BigInt.asIntN(32, max) // -1n
BigInt.asUintN(32, max) // 4294967295n

// Number.parseInt() 与 BigInt.parseInt() 的对比
Number.parseInt('9007199254740993', 10)
// 9007199254740992
BigInt.parseInt('9007199254740993', 10)
// 9007199254740993n
bash 复制代码
const bigNumber = 1234567890123456789012345678901234567890n;
console.log(bigNumber); // 输出:1234567890123456789012345678901234567890n

const sum = 100n + 200n; // 使用 BigInt
console.log(sum); // 输出:300n
相关推荐
何日成熟11 分钟前
修改 vue-pdf 源码升级 pdfjs-dist 包, 以解决部分 pdf 文件显示花屏问题
前端·vue.js·pdf
橙子yq11 分钟前
pdfjs-dist实现pdf预览偶现空白不报错问题解决
前端·javascript·pdf
itachi-uchiha13 分钟前
Apache Apisix配置ip-restriction插件以限制IP地址访问
前端·firefox
每一天,每一步29 分钟前
React+MapBox GL JS引入URL服务地址实现自定义图标标记地点、区域绘制功能
前端·javascript·react.js
取个好名称36 分钟前
适合初学者的 Blender 第二部分
java·前端·blender
阿乐今天敲代码没1 小时前
echarts定制化柱状图——条纹柱状图
前端·echarts
linux-hzh1 小时前
CSS回顾
前端·css
天若有情6731 小时前
C++ 结构体封装模式与 Promise 链式调用:设计思想的异曲同工
前端·javascript·c++
龙泉寺天下行走2 小时前
《进化陷阱》--AI 生成文章 《连载 1》
java·服务器·前端