JS笔记《数值扩展》

138 阅读2分钟

二进制和八进制表示法

  • ES6提供了二进制和八进制数值的新写法,分别用前缀0b0o表示。
0b111110111 === 503 // true
0o767 === 503       // true

Number(0b111110111)  // 503
Number(0o767)        // 503

数值分隔符

  • ES2021允许数值使用下划线(_)作为分隔符。分隔符没有指定间隔位置,隔几位添加都可以。
123_00 === 12300
123_00 === 1_2300
  • 数值分隔符主要是为了编码时书写数值的方便,而不是为了处理外部输入的数据。
Number('123_456') // NaN
parseInt('123_456') // 123

静态方法

Number.isFinite()

  • 检查一个数值是否为有限的。与全局的isFinite()区别是,前者不会调用Number()进行隐式转换,只对数值有效。
isFinite(null)        // true
Number.isFinite(null) // false

isFinite(true)        // true
Number.isFinite(true) // false

isFinite(0)           // true
Number.isFinite(0)    // true

isFinite("123")       // true
Number.isFinite("123")// false

Number.isNaN()

  • 检查一个值是否是NaN。只有NaN返回true,其他一律返回true。与全局的isNaN()区别是,前者不会调用Number()进行隐式转换,只对数值有效。
isNaN(undefined)        // true Number(undefined) => NaN
Number.isNaN(undefined) // false

isNaN('')         // false
Number.isNaN('')  // false

isNaN(NaN)          // true
Number.isNaN(NaN)   // true

Number.parseInt()

  • 与全局的parseInt一致,移植到Number对象上是为了逐步减少全局方法,使得语言逐步模块化。

Number.parseFloat()

  • 与全局的parseFloat一致,移植到Number对象上是为了逐步减少全局方法,使得语言逐步模块化。

Number.isInteger()

  • 判断一个数值是否为整数,如果参数不是数值,则返回false
Number.isInteger(25)   // true
Number.isInteger(25.1) // false

// 整数和浮点数采用同样的储存方式,所以25和25.0被视为同一个值
Number.isInteger(25)   // true
Number.isInteger(25.0) // true

// 不是数值返回 false
Number.isInteger() // false
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // false
  • 不是整数也会返回true, 由于JS采用 IEEE 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位)。
// 小数的精度达到了小数点后16个十进制位,转成二进制位
// 超过了53个二进制位,导致最后的那个`2`被丢弃了
Number.isInteger(3.0000000000000002) // 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