【问题标题】:Why does JavaScript convert parseInt(0000000101126) to 33366 instead of 101126? [duplicate]为什么 JavaScript 将 parseInt(0000000101126) 转换为 33366 而不是 101126? [复制]
【发布时间】:2014-02-11 02:19:00
【问题描述】:

为什么 JavaScript 将 parseInt(0000000101126) 转换为 33366 而不是 101126?

var example = parseInt(0000000101126);
console.log(example); //33366 

【问题讨论】:

  • @MarkWalters 那也打印 33366
  • @Mark literal 0000000000101126 在到达 parseInt 之前就已经被解释为八进制。
  • 不要将值作为文字传递给parseInt(),而是将其作为字符串传递:parseInt('0101126', 10);jsfiddle.net/Nunners/VrYL4/1

标签: javascript


【解决方案1】:

JavaScript 假设如下:

•如果字符串以“0x”开头,则基数为 16(十六进制)
•如果字符串以“0”开头,则基数为8(八进制)。此功能已弃用
•如果字符串以任何其他值开头,则基数为 10(十进制)

【讨论】:

    【解决方案2】:

    尝试将您的值放在引号中,它将为您提供正确的输出:

    代替:

    var example = parseInt(0000000101126);
    

    试试

    var example = parseInt("0000000101126");
    

    【讨论】:

    • 我无法显式编写 parseInt("0000000101126") 因为 0000000101126 来自循环处理的数千行中的一行。即使我先将 0000000101126 放入变量中并使用 example.toString() 将其转换为字符串,它仍然返回 33366
    • @Jonathan 您可以使用产生 parseInt(010126) 信号的代码发布另一个问题(该数字被解释为八进制),您可以获得解决方案。您当前的问题似乎仅限于找出为什么会发生这种正确行为,而不是如何解决您的问题。
    • @DownVoter 拒绝投票的原因将不胜感激。
    【解决方案3】:

    如果parseInt 值从0 开始,javascript 引擎将其评估为octal 值。 但是 ECMAScript 5 removes 八进制解释。

    【讨论】:

      【解决方案4】:

      这是因为它正在被转换为Octal

      parseInt() 函数解析一个字符串并返回一个整数。

      radix 参数用于指定要使用的数字系统 例如,使用基数 16(十六进制)表示 字符串中的数字应从十六进制数解析为 十进制数。 如果 radix 参数被省略,JavaScript 假定如下:

      - If the string begins with "0x", the radix is 16 (hexadecimal)
      - If the string begins with "0", the radix is 8 (octal). This feature is deprecated
      - If the string begins with any other value, the radix is 10 (decimal)
      

      【讨论】:

        【解决方案5】:

        在 C 类型语言中,整数可以用多种方式表示:

        • 在 0101126 前面加 0 作为八进制数
        • 以十进制表示 101126 前没有任何内容
        • 通过将 0x 放在前面作为十六进制数 0x101126

        这些 parseInt 中的每一个都将转换为十进制基数,因此您的八进制基数将转换为十进制数。

        【讨论】:

          【解决方案6】:

          您必须将数字放入“数字”中! parseInt() 函数解析一个字符串并返回一个整数。 像这样:

          var example = parseInt("0000000101126");
          console.log(example);
          

          【讨论】:

            【解决方案7】:

            诀窍在于,不是parseInt 将您的数字解释为八进制,而是 JS 解释器。

            This section 的 ECMAScript 描述了 JS 解释器如何解释源代码中的数字。 This one 描述了八进制数的语法。

            消除八进制字面量歧义的一些过激行为会导致有趣的场景:

            (Chrome 32)

            01.0 // SyntaxError: Unexpected number
            01.9 // SyntaxError: Unexpected number
            09.9 // 9.9
            
            (function(){"use strict"; 01;})() // SyntaxError: Octal literals are not allowed in strict mode.
            (function(){"use strict"; 01.0;})() // SyntaxError: Unexpected number
            (function(){"use strict"; console.log(09.9);})() // 9.9
            

            Firefox 26

            01.0 // SyntaxError: missing ; before statement
            09.0 // SyntaxError: missing ; before statement
            09.9 // 9.9
            
            (function(){"use strict"; 01;})() // SyntaxError: octal literals and octal escape sequences are deprecated
            (function(){"use strict"; 01.0;})() // SyntaxError: octal literals and octal escape sequences are deprecated
            (function(){"use strict"; 09.9;})() // SyntaxError: octal literals and octal escape sequences are deprecated
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-01-22
              • 1970-01-01
              • 1970-01-01
              • 2012-02-04
              • 1970-01-01
              • 2011-11-12
              • 2015-09-16
              相关资源
              最近更新 更多