ES6中的数值扩展

1. 二进制和八进制的表示法

二进制和八进制的前缀分别为0b(或0B)和0o(或0O)表示

在ES5的严格模式下,八进制不再允许使用前缀0表示

如果要将0b0x前缀的字符串数值转为十进制,要使用Number方法

Number('0b111'); // 7
Number('0o10'); // 8

2. Number.isFinite()、Number.isNaN()

Number.isFinite()用来检测一个数值是否是有限的(finite)。


Number.isFinite(15); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite(true); // false

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


Number.isNaN(NaN); // true
Number.isNaN(14); // false
Number.isNaN('str'); // false
Number.isNaN(true); // false
Number.isNaN(9/NaN); // true

这两个方法与全局的isFinite()isNaN()相比,之前的会先调用Number()将非数值转为数
值,然后再进行判断,这两个方法会直接判断,只对数值有效,其他非数值一律为false。

3. Number.parseInt()、Number.parseFloat()

只是将全局的方法移到了Number上

4. Number.isInteger()

用来判断一个值是否为整数,在js中整数和浮点数是同样的存储方法,所以3和3.0视为同一个数。

Number.isInteger(25); // true
Number.isInteger(25.0); // true
Number.isInteger(25.1); // false
Number.isInteger('25'); // false
Number.isInteger(true); // false

5. Number.EPSILON

规定一个极小的常量,目的是为了浮点数计算设置一个误差范围,因为浮点数计算是不准确,只要是误差小于这个常量默认就是得到了一个正确结果。

说白了就是一个可以接受的误差范围。

Number.EPSILON = 2.220446049250313e¯16

0.1 + 0.2 = 0.30000000000000004

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

因为在js中能够准确表示的整数范围是-2^532^53 之间(不包含两个端点),超过这个范围就无法精确表示,所以可以使用Number.isSafeInteger()判断某个值是否是安全的。

Number.MAX_SAFE_INTEGER 代表js能准准确表示的最大值。
Number.MIN_SAFE_INTEGER 代表js能准准确表示的最小值。

Number.isSafeInteger(9) // true
Number.isSafeInteger('a') // false
Number.isSafeInteger(true) // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false

isSafeInteger函数是如何实现的

Number.isSafeInteger = function (n) {
    return (typeof n === 'number' && Math.round(n) === n && Number.MIN_SAFE_INTEGER <= n && n <= Number.MAX_SAFE_INIEGER);
}

在使用Number.isSafeInteger验证时,若有运算不仅要验证结果,也要验证参与运算的每个值,否则会出现问题。


Number.isSafeInteger(9007199254740993) // false
Number.isSafeInteger(900) // true
Number.isSafeInteger(9007199254740993 - 900) // true
9007199254740993 - 900 = 9007199254740002

可以看出9007199254740993不是安全整数,但是计算结果却是安全的。这是因为数据超出了精度范围,就会以最大值存储。

7. Math对象的扩展

1. Math.trunc()

用来去除一个数的小数部分,返回整数部分。

Math.trunc(4.1); // 4
Math.trunc(4.9); // 4
Math.trunc(-4.1); // 4
Math.trunc(-4.0); // 4
Math.trunc(-0.12); // 0

对于非数值会先使用Number转化,会向下取整。

Math.trunc('123.23'); // 123

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

Math.trunc(NaN); // NaN
Math.trunc('foo'); // NaN
Math.trunc(); // NaN

对于不支持该方法,可以用此代码代替

Math.trunc = Math.trunc || function(x) {
    return x < 0 ? Math.ceill(x) : Math.floor(x);
}

2. Math.sign()

用来判断一个数到底是正数、负数还是零,对于非数值,会先将其转化为数值。

  • 参数为正数,返回 +1
  • 参数为负数,返回-1
  • 参数0,返回0
  • 参数-0,返回0
  • 其他值,返回NaN

对于不支持该方法,可以用此代码代替

Math.sign =  Math.sign || function(x) {
    x = +x; // convert to a number
    if (x === 0 || isNaN(x)) {
        return x;
    }
    return x > 0 ? 1 : -1;
}

3. Math.cbrt()

用来计算一个数的立方根

Math.cbrt(-1); // -1
Math.cbrt(1); // 1
Math.cbrt(8); // 2

对于非数值,会先使用Number进行转换

对于不支持该方法,可以用此代码代替

Math.cbrt = Math.cbrt || function (x) {
    var y = Math.pow(Math.abs(x), 1/3);
    return x < 0 ? -y : y;
}

4. Math.fround()

返回一个数的单精度浮点数形式

Math.fround(0); // 0
Math.fround(1); // 1
Math.fround(1.337); // 1.3370000123977661
Math.fround(NaN); // NaN

对于不支持该方法,可以用此代码代替

Math.fround = Math.fround || function(x) {
    return new Float32Array([x])[0];
}

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,超出了安全整数范围 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值