# JS数值方法

# 科学计数法

以下两种情况,JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。

  1. 小数点前的数字多于21位。
1234567890123456789012
// 1.2345678901234568e+21

123456789012345678901
// 123456789012345680000
  1. 小数点后的零多于5个。
// 小数点后紧跟5个以上的零,
// 就自动转为科学计数法
0.0000003 // 3e-7

// 否则,就保持原来的字面形式
0.000003 // 0.000003

# 与数值相关的全局方法

# parseInt()

parseInt方法用于将字符串转为整数。

  • 如果字符串头部有空格,空格会被自动去除。
  • 如果parseInt的参数不是字符串,则会先转为字符串再转换。
parseInt(1.23) // 1
// 等同于
parseInt('1.23') // 1
  • 字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
parseInt('12abc') // 12
  • 如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN。
  • 如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析。
parseInt('0xff') // 255
  • 对于那些会自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。
// 这里整数部分有22位,超过了21位
parseInt(1000000000000000000000.1) // 1
// 相当于
parseInt('1e+21') // 1

// 控制台
1000000000000000000000.1 // 输入
1e+21 // 输出

# parseInt()用于进制转换

  • parseInt方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数
function parseInt(str: string, decimal: number = 10): number;

// 1000的二进制转化成十进制是 8
parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512
// 超过36
parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10
  • 如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。如果最高位无法转换,则直接返回NaN。
// 二进制没有5 4 6,因此只取了已经转换的值
parseInt('1546', 2) // 1
parseInt('546', 2) // NaN
  • 前面说过,如果parseInt的第一个参数不是字符串,会被先转为字符串。这会导致一些令人意外的结果。
parseInt(0x11, 36) // 43
parseInt(0x11, 2) // 1

// 等同于
parseInt(String(0x11), 36)
parseInt(String(0x11), 2)

// 等同于
// 十六进制的0x11会被先转为十进制的17,再转为字符串
parseInt('17', 36)
parseInt('17', 2)
  • 对于八进制
parseInt(011, 2) // NaN

// 等同于
parseInt(String(011), 2)

// 等同于
parseInt(String(9), 2)

注意:JavaScript 不再允许将带有前缀0的数字视为八进制数,而是要求忽略这个0。但是,为了保证兼容性,大部分浏览器并没有部署这一条规定。

  • 总结

parseInt的第一个参数无论如何都会先转换为十进制表示法,再转换为字符串,最后将该字符串转换为十进制。

# parseFloat()

# isNaN()

# isFinite()

isFinite方法返回一个布尔值,表示某个值是否为正常的数值

isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true

除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true。

# 参考文章

JavaScript 标准参考教程(基本语法之数值) —— 阮一峰 (opens new window)

Last Updated: 2/7/2020, 7:07:30 PM