带有前导零的Javascript parseInt()

sav*_*ger 116 javascript

Javascript的parseInt函数似乎没有完全奏效.

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0
Run Code Online (Sandbox Code Playgroud)

你无法解释.试试看.(的jsfiddle)

编辑自问及此问题后,默认为八进制基数的"特征"已被弃用.[ 1 ] [ 2 ]

Roc*_*mat 178

这是因为如果数字以'0'开头,则将其视为基数8(八进制).

您可以通过将基数作为第二个参数传递来强制基数.

parseInt("09", 10) // 9
Run Code Online (Sandbox Code Playgroud)

根据文档,第二个参数是可选的,但并不总是假设为10,正如您从示例中看到的那样.

  • @PeeyushKushwaha:其他方式.基数为8的"11"在基数10中为"9"."09"不是有效的基数8. (2认同)

Way*_*ett 39

调用parseInt应始终在第二个参数中指定基数:

parseInt("08", 10);
Run Code Online (Sandbox Code Playgroud)

早期版本的JavaScript处理0以八进制开头的字符串(当没有指定基数时),08也不09是有效的八进制数.

从Mozilla 文档:

如果radix未定义或为0,则JavaScript假定以下内容:

  • 如果输入字符串以"0x"或"0X"开头,则基数为16(十六进制).
  • 如果输入字符串以"0"开头,则基数为8(八进制).此功能是非标准的,有些实现故意不支持它(而是使用基数10).因此,在使用parseInt时始终指定基数.
  • 如果输入字符串以任何其他值开头,则基数为10(十进制).

如果第一个字符无法转换为数字,则parseInt返回NaN.

ECMAScript 3标准:

当radix为0或未定义且字符串的数字以0 开头后跟xX开头时,实现可以自行决定将数字解释为八进制或十进制.鼓励实现将这种情况下的数字解释为十进制.

最新版本的JavaScript(ECMAScript 5)放弃了这种行为,但您仍应指定基数以满足旧版浏览器的要求.


Joh*_*ock 15

有一个Radix参数

parseInt(value, base)
Run Code Online (Sandbox Code Playgroud)

基数是基数.

在这种情况下,您正在评估base10(十进制)数字,因此使用

parseInt(value, 10);
Run Code Online (Sandbox Code Playgroud)