带有前导零的 Javascript parseInt()

IT技术 javascript
2021-02-07 10:03:50

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 ]

6个回答

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

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

parseInt("09", 10) // 9

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

是的,但如果假设是八进制,它应该为 09 返回 11 而不是 0。
2021-03-17 10:03:50
但是我想在parseInt之后是09,有什么办法可以解决
2021-03-17 10:03:50
@PeeyushKushwaha:其他方式。 11在基数 8 中是9基数 10。 09不是有效的基数 8 数字。
2021-04-04 10:03:50

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

parseInt("08", 10);

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

从 Mozilla文档

如果 radix 未定义或为 0,则 JavaScript 假设如下:

  • 如果输入字符串以“0x”或“0X”开头,则基数为 16(十六进制)。
  • 如果输入字符串以“0”开头,则基数为八(八进制)。这个特性是非标准的,一些实现故意不支持它(而是使用基数 10)。出于这个原因,在使用 parseInt 时总是指定一个基数
  • 如果输入字符串以任何其他值开头,则基数为 10(十进制)。

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

并且来自ECMAScript 3标准:

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

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

由于这已被弃用,将来您可以使用前导零,不是吗?
2021-03-26 10:03:50

有一个基数参数

parseInt(value, base)

其中 base 是基数。

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

parseInt(value, 10);

这在新浏览器中似乎并不完全有效。如果您执行 'parseInt("08")',Internet Explorer 9 和 10 将返回 8,而 Internet Explorer 8 和以前的版本将返回 0(在 quirks 模式下的 IE10 也将返回 0)。

最新版本的 Chrome 也返回 8 所以他们最近肯定改变了解释。

是的,Firefox 和 Chrome 最新版本现在没有问题。
2021-03-18 10:03:50
是的,行为改变了。我会更新我的答案。developer.mozilla.org/en-US/docs/JavaScript/Reference/...
2021-04-11 10:03:50

此问题现已弃用。但是您仍然可以使用基数 inparseInt将其他基数转换为基数 10。例如,

var baseTwoNumber = parseInt('0010001', 2);

返回17(以 10 为底0010001)。