数值的扩展

118 阅读4分钟

二进制和八进制表示法

ES6 提供了二进制和八进制的新写法

  • 二进制用前缀 0b(或 0B)
  • 八进制用前缀 0o(或 0O)

Number.isFinite()、Number.isNaN()

  • Number.isFinite() 用来检查一个数值是否是有限的
  • Number.isNaN() 用来检查一个值是否是 NaN

和传统的全局方法 isFinite()isNaN() 不同

  • 传统方法先调用 Number() 将非数值转为数值,再进行判断
  • 新方法只对数值生效,对于非数值一律方为 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

Number.parseInt()、Number.parseFloat()

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

Number.isInteger()

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

Number.EPSILON

ES6 在 Number 对象上新增了一个极小的常量 Number.EPSILON

Number.EPSILON // 2.220446049250313e-16

Number.EPSILON.toFixed(20) // '0.00000000000000022204'

引入一个这么小的量,目的在于为浮点数计算设置一个误差值

0.1 + 0.2 // 0.30000000000000004

Number.EPSILON 的实质是一个可以接受的误差范围

安全整数和 Number.isSafeInteger()

JavaScript 能够准确表示的整数范围在 -2^532^53 之间(不含两个断点),超出这个范围就无法精确表示

ES6 引入 Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER 两个常量,用来表示这个范围的上下限

Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true
Number.MIN_SAFE_INTEGER === -1 * Math.pow(2, 53) + 1 // true

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

Number.isSafeInteger('a') // false
Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger('1') // false

Math 对象的扩展

  • Math.trunc():用于去除一个数的小数部分,返回整数部分

    • 对于非数值,会先将其转化为数值
    • 对于控制和无法截取整数的值,返回 NaN
  • Math.sign():用来判断一个数到底是正数、负数还是零

    • 对于非数值,会先将其转化为数值
    • 正数,返回 1
    • 负数,返回 -1
    • 0,返回 0
    • -0,返回 -0
    • 其它,返回 NaN
  • Math.cbrt():用来计算一个数的立方根

    • 对于非数值,会先将其转化为数值
  • Math.clz32():返回一个数的 32 位无符号整数形式有多少个前导0

    • 对于小数,只考虑整数部分
    • 对于控制和其它类型的值,会先将其转化为数值
  • Math.imul():返回两个数以 32 为带符号整数形式相乘的结果,返回也是一个 32 位带符号整数

  • Math.fround():返回一个数的单精度浮点数形式

    • 对于整数,返回结果不会有任何不同
    • 对于无法用 64 个二进制位精确表示的小数,会返回最接近这个小数的单精度浮点数
  • Math.hypot():返回所有参数的平方和的平方根

    • 参数不是数值,会先将其转化为数值
    • 只要有一个参数无法转化为数值,就会返回 NaN
  • Math.expm1()

    • Math.expm1(x) 返回 e^x - 1 ,即 Math.exp(x) - 1
  • Math.log1p()

    • Math.log1p(x) 返回 ln(1+n)Math.log(1+x)
    • 如果 x 小于 -1 ,则返回 NaN
  • Math.log10()

    • Math.log10(x) 返回以 10 为底的 x 的对数
    • 如果 x 小于 0 ,则返回 NaN
  • Math.log2()

    • Math.log2(x) 返回以 2 为底的 x 的对数
    • 如果 x 小于 0 ,则返回 NaN
  • Math.sinh(x):返回 x 的双曲正弦

  • Math.cosh(x):返回 x 的双曲余弦

  • Math.tanh(x):返回 x 的双曲正切

  • Math.asinh(x):返回 x 的反双曲正弦

  • Math.acosh(x):返回 x 的反双曲余弦

  • Math.atanh(x):返回 x 的反双曲正切

  • Math.signbit()

    • Math.sign() 用来判断一个值的正负
    • 在判断符号位的正负时,Math.sign() 不是很有用
    • Math.signbit() 用来判断一个数的符号位是否已经设置

Integer 数据类型

Integer 类型的数据只能用来表示整数,没有位数限制,任何位数的整数都可以精确表示

Integer 类型的数据必须使用后缀 n 来表述

1n + 2n // 3n

Integer 类型的数据, typeof 运算符将返回 integer

JavaScript 提供了 Integer 对象,用来生成 Integer 类型的数值,转换规则基本和 Number 一致

Integer 运算方面,+-* 和 Number 类型一致,除法会舍去小数部分,返回一个整数

不带符号的右移位运算符 >>> 和 一元的求正运算符 +,这两种在使用时会报错

  • >>> 要求最高位补0,但 Integer 没有最高位,导致这个运算符无意义
  • + 返回 Number 类型

Integer 类型不能和 Number 类型进行混合运算,因为无论返回的是 Integer 还是 Number ,都会丢失信息

相等运算符(==)会改变数据类型,也是不允许混合使用的

精确相等运算符(===)不会改变数据类型,可以混合使用