ES6之数值的扩展

1. 数值的扩展

ECMAScript 6 (ES6) 对数值的扩展引入了一些新的特性和方法,旨在提高数值处理的便利性和精确度。

以下是一些关键的扩展点及其示例:

1.1. 二进制和八进制字面量表示:

  • ES6 引入了新的字面量表示法来直接表示二进制和八进制数。
    • 二进制前缀为 0b0B
    • 八进制前缀为 0o0O
let binary = 0b1010; // 二进制表示10,十进制为10
let octal = 0o12;    // 八进制表示12,十进制为10
  • 如果要将 0b 和 0o 前缀的字符串数值转为十进制,要使用 Number 方法。
Number('0b111') // 7
Number('0o10') // 8

1.2. 数值判断方法:

1.2.1. Number.isFinite() 检查一个值是否为有限的数值。
console.log(Number.isFinite(15)); // true
console.log(Number.isFinite(Infinity)); // false

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
1.2.2. Number.isNaN() 更准确地检测NaN值。
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("Hello")); // 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
1.2.3. 传统的全局方法 isFinite() 和 isNaN() 的区别
  • 传统方法先调用 Number() 将非数值的值转为数值,再进行判断,
  • 而这两个新方法只对数值有效, Number.isFinite() 对于非数值一律返回 false , Number.isNaN() 只有对于 NaN 才返回 true ,非 NaN 一律返回 false 。
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
Number.isNaN(1) // false

1.3. 数值转换方法:

  • Number.parseInt()Number.parseFloat() 作为全局函数的严格版本,直接绑定在 Number 对象上。
console.log(Number.parseInt("123px")); // 123
console.log(Number.parseFloat("123.45em")); // 123.45

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

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

1.4. 整数检查与精度:

1.4.1. Number.isInteger() 判断一个值是否为整数。
console.log(Number.isInteger(42)); // true
console.log(Number.isInteger(42.1)); // false

需要注意的是,在JavaScript 内部,整数和浮点数是同样的储存方法,所以3和3.0被视为同一个值

Number.isInteger(25) // true
Number.isInteger(25.0) // true
Number.isInteger(25.1) // false
Number.isInteger("15") // false
Number.isInteger(true) // false
1.4.2. Number.EPSILON 提供了一个极小的常量,用于比较浮点数时的误差容限。

根据规格,它表示1与大于1的最小浮点数之间的差。

let num = 0.1 + 0.2;
console.log(Math.abs(num - 0.3) < Number.EPSILON); // true,判断浮点运算的误差

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

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

Number.EPSILON 可以用来设置“能够接受的误差范围”。

比如,误差范围设为2的-50次方(即 Number.EPSILON * Math.pow(2, 2) ),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2) // true
1.4.3. Number.isSafeInteger() 检查一个值是否为安全的整数(在 -(2^53) 到 2^53 之间)。

超过这个范围,无法精确表示这个值。

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_INTEGERNumber.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() 则是用来判断一个整数是否落在这个范围之内。

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.5. 数值分隔符:

  • 数值字面量中可以使用下划线 _ 作为视觉上的千位分隔符,提高可读性。
let million = 1_000_000; // 等同于1000000

1.6. Math对象的扩展:

ES6对Math对象进行了扩展,增加了一系列新的方法来提供更强大的数学运算功能。以下是一些主要的扩展方法及其使用示例:

1.6.1. Math.trunc() 移除一个数的小数部分,返回整数部分。
console.log(Math.trunc(3.14)); // 3

对于非数值, Math.trunc 内部使用 Number 方法将其先转为数值。

Math.trunc('123.456') // 123
Math.trunc(true) //1
Math.trunc(false) // 0
Math.trunc(null) // 0

对于空值和无法截取整数的值,返回 NaN 。

Math.trunc(NaN); // NaN
Math.trunc('foo'); // NaN
Math.trunc(); // NaN
Math.trunc(undefined) // NaN
1.6.2. Math.sign():

用来判断一个数的符号,返回五种可能的值:1(正数)、0(零)、-1(负数)、-0(负零)、NaN(非数字)。

console.log(Math.sign(23));   // 输出: 1
console.log(Math.sign(-23));  // 输出: -1
console.log(Math.sign(0));    // 输出: 0
console.log(Math.sign(-0));   // 输出: -0
console.log(Math.sign('a'));  // 输出: NaN
1.6.3. Math.cbrt():

计算一个数的立方根。

console.log(Math.cbrt(27)); // 输出: 3
1.6.4. Math.hypot():

返回所有参数的平方和的平方根,常用于计算直角三角形的斜边长度。

console.log(Math.hypot(3, 4)); // 输出: 5
1.6.5. 对数方法:
  • Math.expm1(x) 返回 e^x - 1
  • Math.log1p(x) 返回 1 + x 的自然对数。
  • Math.log10(x) 返回以10为底x的对数。
  • Math.log2(x) 返回以2为底x的对数。
console.log(Math.expm1(1));  // 输出:约等于 1.71828
console.log(Math.log1p(1));  // 输出: 0.6931471805599453
console.log(Math.log10(100)); // 输出: 2
console.log(Math.log2(8));    // 输出: 3
1.6.6. Math.clz32():

返回一个数的32位无符号整数形式的前导零的个数。

console.log(Math.clz32(0b00000000000000000000000000001010)); // 输出: 26

这些方法丰富了JavaScript的数学运算能力,使得处理数学问题更加高效和便捷。

  • 45
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ES6 引入了一些数值扩展,其中包括了新的数值类型(如二进制和八进制)、新的数学方法和常量。 1. 二进制和八进制 在 ES6 中,我们可以使用 `0b` 或 `0B` 前缀来表示二进制数,使用 `0o` 或 `0O` 前缀来表示八进制数。例如: ```javascript let binary = 0b1010; // 二进制的 10 let octal = 0o777; // 八进制的 511 ``` 2. Number.isFinite() `Number.isFinite()` 方法用于检查一个数值是否为有限数。与全局的 `isFinite()` 函数不同的是,`Number.isFinite()` 不会将非数值转换为数值。例如: ```javascript Number.isFinite(Infinity); // false Number.isFinite(-Infinity); // false Number.isFinite(NaN); // false Number.isFinite(123); // true ``` 3. Number.isNaN() `Number.isNaN()` 方法用于检查一个数值是否为 NaN。与全局的 `isNaN()` 函数不同的是,`Number.isNaN()` 只有在参数是数值且等于 NaN 时才返回 true。例如: ```javascript Number.isNaN(NaN); // true Number.isNaN('hello'); // false Number.isNaN(123); // false ``` 4. Number.parseInt() `Number.parseInt()` 是 `parseInt()` 的一个新的方法,它将字符串转换为整数,并且只接受数字作为字符串的参数。例如: ```javascript Number.parseInt('123'); // 123 Number.parseInt('123.45'); // 123 Number.parseInt('hello'); // NaN ``` 5. Number.parseFloat() `Number.parseFloat()` 是 `parseFloat()` 的一个新的方法,它将字符串转换为浮点数,并且只接受数字作为字符串的参数。例如: ```javascript Number.parseFloat('3.14'); // 3.14 Number.parseFloat('3.14hello'); // 3.14 Number.parseFloat('hello'); // NaN ``` 6. Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER `Number.MAX_SAFE_INTEGER` 和 `Number.MIN_SAFE_INTEGER` 属性分别表示 JavaScript 中最大的安全整数和最小的安全整数。例如: ```javascript Number.MAX_SAFE_INTEGER; // 9007199254740991 Number.MIN_SAFE_INTEGER; // -9007199254740991 ``` 7. Number.isSafeInteger() `Number.isSafeInteger()` 方法用于检查一个数值是否为安全整数。安全整数是指符合以下两个条件的整数: - 在 JavaScript 中能够精确表示。 - 绝对值不大于 `Number.MAX_SAFE_INTEGER`。 例如: ```javascript Number.isSafeInteger(123); // true Number.isSafeInteger(9007199254740992); // false,超出了安全整数范围 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端布道人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值