Javascript parseInt() 与前导零

2022-08-30 04:35:22

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

你无法解释这一点。试一试。(jsFiddle)

编辑自从提出并回答了这个问题以来,默认为八进制基数的“功能”已被弃用。[1] [2]]


答案 1

这是因为如果一个数字以“0”开头,它将被视为以8为基数(八进制)。

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

parseInt("09", 10) // 9

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


答案 2

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

parseInt("08", 10);

早期版本的 JavaScript 将 以 开头的字符串视为八进制(当未指定基数时),既不是有效的八进制数,也不是有效的八进制数。00809

来自 Mozilla 文档

如果基数未定义或为 0,JavaScript 将假定以下内容:

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

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

ECMAScript 3 标准:

当基数为 0 或未定义,并且字符串的数字以 0 位开头,后面没有 xX 时,实现可以自行决定将数字解释为八进制或十进制。在这种情况下,鼓励实现将数字解释为十进制。

最新版本的 JavaScript (ECMAScript 5放弃了此行为,但您仍应指定基数以满足较旧的浏览器。