【问题标题】:What do you think parseInt("08") will return? [duplicate]你认为 parseInt("08") 会返回什么? [复制]
【发布时间】:2011-09-18 14:17:34
【问题描述】:

可能重复:
Workarounds for JavaScript parseInt octal bug

令人惊讶的是它返回0。为什么?获得正确结果的(正确)解决方案是什么?

【问题讨论】:

  • @Sorrow:除了它是用于 Java,而不是 Javascript。

标签: javascript parsing


【解决方案1】:

使用基数:

var x = parseInt("08", 10);

一些 JavaScript 实现为标准定义的两个数字系统添加了第三个数字系统(十进制,默认值;和十六进制,前缀为 0x):八进制,前缀为 0。这是非标准,但在latest spec 中被认为是常见的。

由于8 不是有效的八进制数字,parseInt 停在那里,返回值0

通过显式使用基数,您告诉parseInt 不要试图找出正在使用的数字系统,而是使用您指定的数字系统。您在输入parseInt 时的直觉应该总是指定基数;不这样做会让你对怪事持开放态度。

【讨论】:

  • 感谢克劳德,我喜欢这个解释。
【解决方案2】:

“08”表示基于 8 的数字。您应该指定第二个参数。

 parseInt("08", 10)

【讨论】:

    【解决方案3】:

    @T.J. gave a great explanation for the behaviour you see。解析数字字符串的另一种方法是使用一元+

    var num = +"08";
    

    【讨论】:

      【解决方案4】:

      来自http://www.bennadel.com/blog/2012-Exploring-Javascript-s-parseInt-And-parseFloat-Functions.htm

      以“0”开头的字符串被假定为base8(八进制)。

      【讨论】:

        【解决方案5】:

        来自 MDC - parseInt:

        如果输入字符串以“0”开头,则基数为八(八进制)。这个特性是非标准的,一些实现故意不支持它(而是使用基数 10)。因此,在使用 parseInt 时始终指定一个基数。

        还有例子:

        parseInt("08"); // 0, '8' 不是八进制数。

        也就是说,由于没有传入基数并且字符串以0 开头,因此假定为八进制。由于8 不是八进制数字,因此无法解析。

        解决方案?始终提供 radix 参数:

        parseInt("08", 10);
        

        【讨论】:

          【解决方案6】:

          如果你通过 jslint 运行它,它会因为不包含 radix 参数而对你大喊大叫。是的,基数是可选的,但可能每次都应该包括在内。除非另有说明,否则以 0 开头的数字假定为八进制。

          var foo = parseInt("08", 10);
          

          【讨论】:

            【解决方案7】:

            以“0”为前缀的数字是八进制数。 8 是无效的八进制数。所以结果是 0

            【讨论】:

              猜你喜欢
              • 2012-09-01
              • 2012-02-04
              • 2014-06-06
              • 1970-01-01
              • 2012-07-31
              • 2016-10-16
              • 2018-10-01
              • 2023-01-26
              • 2013-10-02
              相关资源
              最近更新 更多