【阮一峰ES6入门教程学习笔记】数值的扩展

数值扩展

  • 二进制和八进制表示法
    • ES6 分别用前缀0b(或0B)和0o(或0O)表示二进制和八进制数值。
  • Number对象上新增方法
    • Number.isFinite():检查一个数值是否为有限的(finite),即不是Infinity。
    • Number.isNaN():用来检查一个值是否为NaN。
      • 与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数 值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。
    • Number.parseInt(),Number.parseFloat():ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。
    • Number.isInteger():判断一个数是否为整数。
      • JavaScript 内部,整数和浮点数采用的是同样的储存方法,25和25.0被视为同一个值
      • 参数不是数值的话直接返回false
      • 对数据精度要求较高就不适合用Number.isInteger()判断一个数值是否为整数。比如会出现:Number.isInteger(3.0000000000000002) // true
    • Number.EPSILON,一个常量,表示 1 与大于 1 的最小浮点数之间的差。实际上就是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了,可以认为两者是相等的。
      • 比如:0.1 + 0.2 === 0.3 // false 因为0.1 + 0.2 // 0.30000000000000004
      • console.log(0.1+0.2 === 0.3) //false
        console.log(0.1+0.2-0.3 < Number.EPSILON) //true
    • Number.isSafeInteger()
      • 安全整数:JavaScript 能够准确表示的整数范围在-253 和 253之间(不含两个端点)超过这个范围无法精确表示这个值。ES6 引入Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER这两个常量,用来表示这个范围的上下限。
      • Number.isSafeInteger()则是用来判断一个整数是否落在这个范围之内。
        • 实际使用这个函数时,需要注意。验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值。
  • Math的扩展
    • Math.trunc():去除一个数的小数部分,返回整数部分。
      • 对于非数值,首先将其转为数值
      • 对于空值和无法截取整数的值返回NaN
    • Math.sign():用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。对于那些无法转为数值的值,会返回NaN
      • 参数为正数,返回+1;
        参数为负数,返回-1;
        参数为 0,返回0;
        参数为-0,返回-0;
        其他值,返回NaN。
    • Math.cbrt():用于计算一个数的立方根。对于非数值,Math.cbrt()方法内部也是先使用Number()方法将其转为数值。
    • Math.clz32():将参数转为 32 位无符号整数的形式然后返回这个 32 位值里面有多少个前导 0。对于空值或其他类型的值,Math.clz32方法会将它们先转为数值,然后再计算。
      • 对于小数只考虑整数部分
      • 左移运算符(<<)与Math.clz32方法直接相关。
    • Math.imul():返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。之所以需要部署这个方法,是因为 JavaScript 有精度限制,超过 2 的 53 次方的值无法精确表示。这就是说,对于那些很大的数的乘法,低位数值往往都是不精确的,Math.imul方法可以返回正确的低位数值。
    • Math.fround():返回一个数的32位单精度浮点数形式。
    • Math.hypot():返回所有参数的平方和的平方根。如果参数不是数值,Math.hypot方法会将其转为数值。只要有一个参数无法转为数值,就会返回 NaN。
    • 新增4个对数相关方法
      • Math.expm1():返回 ex - 1,即Math.exp(x) - 1。
      • Math.log1p():Math.log1p(x)方法返回1 + x的自然对数,即Math.log(1 + x)。如果x小于-1,返回NaN。
      • Math.log10():返回以 10 为底的x的对数。如果x小于 0,则返回 NaN。
      • Math.log2():返回以 2 为底的x的对数。如果x小于 0,则返回 NaN。
    • 新增 6 个双曲函数方法。
      • Math.sinh(x) 返回x的双曲正弦(hyperbolic sine)
      • Math.cosh(x) 返回x的双曲余弦(hyperbolic cosine)
      • Math.tanh(x) 返回x的双曲正切(hyperbolic tangent)
      • Math.asinh(x) 返回x的反双曲正弦(inverse hyperbolic sine)
      • Math.acosh(x) 返回x的反双曲余弦(inverse hyperbolic cosine)
      • Math.atanh(x) 返回x的反双曲正切(inverse hyperbolic tangent)
  • 指数运算符
    • ES2016新增了一个指数运算符(**),这个运算符的一个特点是右结合,而不是常见的左结合。多个指数运算符连用时,是从最右边开始计算的。
  • BigInt
    • BigInt数据类型出现的原因:
      • 数值的精度只能到 53 个二进制位(相当于 16 个十进制位),大于这个范围的整数,JavaScript 是无法精确表示的。
      • 大于或等于2的1024次方的数值,JavaScript 无法表示,会返回Infinity。
    • ES2020引入BigInt这一新的数据类型,只用来标识整数,没有位数的限制,任何位数的整数都可以精确表示。
      • 与Number区别,必须添加后缀n,而且与普通整数是两种值。 42n === 42 // false
      • 同样可以使用各种进制表示,都要加上后缀n 比如:0b1101n // 二进制
      • typeof运算符对于 BigInt 类型的数据返回bigint。
      • 可以使用负号(-),但是不能使用正号(+)
    • BigInt对象
      • 可以用作构造函数生成 BigInt 类型的数值。BigInt()构造函数必须有参数,而且参数必须可以正常转为数值,尤其注意字符串‘123n’是无法解析成Number的,参数小数也会报错。
        • BigInt.prototype.toString()
        • BigInt.prototype.valueOf()
        • BigInt.asUintN(width, BigInt): 给定的 BigInt 转为 0 到 2width - 1 之间对应的值。
        • BigInt.asIntN(width, BigInt):给定的 BigInt 转为 -2width - 1 到 2width - 1 - 1 之间对应的值。
        • BigInt.parseInt(string[, radix]):近似于Number.parseInt(),将一个字符串转换成指定进制的 BigInt。
    • 类型转换
      • 可以使用Boolean()、Number()和String()这三个方法,将 BigInt 可以转为布尔值、数值和字符串类型。取反运算符(!)也可以将 BigInt 转为布尔值。注意:String(1n) // “1” n会消失
    • 数学运算
      • BigInt 类型的+、-、*和**这四个二元运算符,与 Number 类型的行为一致。除法运算/会舍去小数部分,返回一个整数。比如:9n / 5n //1n
      • 几乎所有的数值运算符都可以用在 BigInt,但是有两个例外。
        • 不带符号的右移位运算符>>>
        • 一元的求正运算符+
      • BigInt 不能与普通数值进行混合运算。比如常见的错误,如果一个标准库函数的参数预期是 Number 类型,但是得到的是一个 BigInt,就会报错。Math.sqrt(4n) // 报错
    • 其他运算
      • BigInt 对应的布尔值,即0n会转为false,其他值转为true。
      • 比较运算符(比如>)和相等运算符(==)允许 BigInt 与其他类型的值混合计算
      • BigInt 与字符串混合运算时,会先转为字符串,再进行运算。比如:’’ + 123n // “123”
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值