Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带前导零的Javascript parseInt()_Javascript - Fatal编程技术网

带前导零的Javascript parseInt()

带前导零的Javascript parseInt(),javascript,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") retur

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
你无法解释


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

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

parseInt("08", 10);
早期版本的JavaScript将以
0
开头的字符串视为八进制(如果未指定基数),并且
08
09
都不是有效的八进制数

来自Mozilla:

如果基数未定义或为0,JavaScript将假定:

  • 如果输入字符串以“0x”或“0x”开头,则基数为16 (十六进制)
  • 如果输入字符串以“0”开头,则基数为8 (八进制)。此功能是非标准的,有些实现 故意不支持它(而是使用基数10)。为此 原因使用parseInt时始终指定基数
  • 如果输入字符串 从任何其他值开始,基数为10(十进制)
如果第一个字符无法转换为数字,则parseInt返回NaN

根据标准:

当基数为0或未定义且字符串的数字以0开始时 数字后面不跟有xx,则实现可能会 判断,将数字解释为八进制或 十进制的鼓励实施人员解释本节中的数字 大小写为十进制


最新版本的JavaScript(),但仍应指定基数以满足较旧浏览器的要求。

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

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

parseInt("09", 10) // 9

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

有一个基数参数

parseInt(value, base)
其中base是基数

在本例中,您正在计算基数为10(十进制)的数字, 因此使用

parseInt(value, 10);

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


Chrome的最新版本还返回8,因此他们最近一定更改了解释。

提示:正如您现在所知,默认值为octal的版本何时被弃用。下面是如何在传统浏览器中修复它

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

这个问题现在已被弃用。但您仍然可以在
parseInt
中使用基数将其他基数转换为base-10。例如:

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

返回
17
(这是
0010001
的base-10)。

在大多数浏览器中,这个问题现在似乎已经改变了

Firefox 51.0.1(64位)

Chrome 55.0.2883.95(64位)

Safari 10.0(12602.1.50.0.10)

=====

推荐做法 话虽如此,为了安全起见并避免出现问题,请使用中建议的base/radix参数

额外测试 我只是想测试一下,如果参数不是字符串的话。 Chrome&Safari给出了准确的结果。Firefox也会返回正确的结果,但会发出警告

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)

你一定是在开玩笑。你不能解释。是的,你可以=>自古以来,任何以0开头的数字都代表八进制,0x代表十六进制。我相信这对所有语言来说都是通用的,但我可能又错了。仅供参考:,比在线JavaScript测试员更好。@JohnHartsock Yeh,因为我们都在这篇文章上是的,行为已经改变了。我会更新我的答案。是的,Firefox和Chrome的最新版本现在没有问题。是的,但是如果它假定为八进制,那么09应该返回11,而不是0。@PeeyushKushwaha:反过来说<基数8中的代码>11是基数10中的代码>9
09
不是一个有效的基数8。但是我想在parseInt之后使用09,有什么办法吗?因为这是不推荐使用的,将来您可以使用前导零,不是吗?注意:如果您只使用带前导零(而不是字符串)的常量,在所有当前浏览器中,它仍然被视为基数8。如果该值以0开头并且是一个数字,则parseInt仍将使用基数8。尝试parseInt(020)Yes。我甚至指出了建议的答案。我知道要避免的最佳做法和不良特性。因此,我在回答中也给出了推荐做法。
parseInt("09")   // 9
parseInt("09")   // 9
parseInt("09", 10)    // 9
parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)