# JS数值方法
# 科学计数法
以下两种情况,JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。
- 小数点前的数字多于21位。
1234567890123456789012
// 1.2345678901234568e+21
123456789012345678901
// 123456789012345680000
- 小数点后的零多于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。