实现字符串转数字的方法:

  1. parseInt
  2. parseFloat
  3. Number
  4. 隐式转换

parseInt

与 Number.parseInt() 是同一个函数。
即:parseInt === Number.parseInt // true

语法

parseInt - JavaScript | MDN

parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数。

parseInt(string, radix);

parseInt() 接收两个参数: string、radix。string 如果参数不是一个字符串,则将其转换为字符串(使用toString())。字符串开头的空白符将会被忽略。radix 表示字符串的基数,默认为10。
返回解析后的整数值。如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN

注意:radix参数为n 将会把第一个参数看作是一个数的n进制表示,而返回的值则是十进制的。

踩坑

  • 1.包含e字符数值(科学计数法)会造成难以预料的结果。如:
1
2
parseInt("6.022e23", 10) // 6
parseInt(6.022e2, 10) // 602

parseInt() 可以达到 Math.floor() 相同的效果,但不应该这样做。

  • 2.string 遇到不属于 radix 参数所指定的基数中的字符,那么该字符和其后的字符都将被忽略。接着返回已经解析的整数部分。开头和结尾的空白符会被忽略。如:
1
2
parseInt("15abc", 10) // 15 'a' 不是十进制中的字符
parseInt("15945", 8) // 15 '9' 不是八进制中的字符
  • 3.在没有指定基数,或者基数为 0 的情况下:

    • 如果字符串 string 以”0x”或者”0X”开头, 则基数是16。如:
    1
    parseInt("0x11") // 17
    • 如果字符串 string 以”0”开头, 则基数是8或者10(十进制),具体是哪个基数由运行环境决定。所以,永远都要明确给出 radix 参数的值

    • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。如:

    1
    parseInt("15") // 15
  • 4.如果第一个字符不能被转换成数字,parseInt 返回 NaN。如:

1
parseInt('a') // NaN

NaN 不是任何一个进制下的数。可以调用 isNaN 来判断 parseInt 是否返回 NaNNaN 参与的数学运算其结果总是 NaN

将整型数值以特定基数转换成它的字符串值可以使 intValue.toString(radix).

一个更严格的解析函数

parseFloat

语法

与 Number.parseFloat() 是同一个函数。
即:parseFloat === Number.parseFloat // true

parseFloat() 函数解析一个字符串参数并返回一个浮点数。

parseFloat - JavaScript | MDN

接收一个参数 value,试图将 value 的值转换为浮点数,并返回转换的结果,如果 value 不能转换成数值,返回 NaN。

1
2
3
parseFloat("3.14") // 3.14
parseFloat("314e-2") // 3.14
parseFloat("0.0314E+2") // 3.14

其它

  • 同 parseInt() 类似,在解析过程中遇到了正负号(+或-),数字(0-9),小数点,或者科学记数法中的指数(e或E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。同时参数字符串首位的空白符会被忽略。
1
parseFloat("3.14more non-digit characters") // 3.14
  • value 无法转换成数值:如果参数字符串的第一个字符不能被解析成为数字,则 parseFloat 返回 NaN。
1
parseFloat("FF2") // NaN
  • parseFloat 也可转换和返回Infinity值. 可以使用 isFinite 函数来判断结果是否是一个有限的数值 (非 Infinity, -Infinity, 或 NaN)。

NaN 参与的数学运算其结果总是 NaN

  • parseFloat 也可以转换一个已经定义了 toString 或者 valueOf 方法的对象,它返回的值和在调用该方法的结果上调用 parseFloat 值相同。
1
2
3
parseFloat(3.14) // 3.14 调用了 3.14.toString()
parseFloat(3.14.toString()) // 同样返回 3.14
parseFloat(3.14.valueOf()) // 也是 3.14

更严格的转换函数

Number

Number 对象可由构造函数 Number() 创建(new Number(value)),如果参数无法被转换为数字,则返回 NaN。但,当不使用 new 关键字调用 Number 函数时,Number 会对参数进行类型转换。

1
2
3
4
5
6
7
Number("123") // 123
Number("") // 0
Number("0x11") // 17
Number("0b11") // 3
Number("0o11") // 9
Number("foo") // NaN
Number("100a") // NaN

隐式转换

1
2
3
4
5
6
7
8
9
10
~~str       // 按位非
str / 1 // 除一个数
str * 1 // 乘一个数
str - 0 // 减去0

~ / * - 用于整数的运算,这里进行隐式转换:ToNumber

+str // 一元运算符 "+"

同上

链接