为什么JavaScript的parseInt的基数默认为8?

时间:2011-04-08 20:20:34

标签: javascript

在JavaScript的parseInt函数中将基数默认为8(如果字符串以0开头)让我烦恼,只因为我继续忘记将可选的第二个参数传递为10.我正在寻找答案告诉我为什么它将其默认设置为8是有意义的。

3 个答案:

答案 0 :(得分:26)

如果输入字符串以0开头,它只会“默认”为8.这是C和C ++的不幸结转。

您可以改为使用Number('0123'),或者正如您在问题中所说的那样parseInt('0123', 10)

How do I work around JavaScript's parseInt octal behavior?


  

你能告诉我更多有关这种结转的信息吗?


注意:ECMAScript strict mode removes octal syntax.

答案 1 :(得分:7)

如果一个数字以0开头并且包含0到7之间的数字(包括0和7),则它被解释为八进制数字(基数为8而不是10)。

在parseInt中,如果一个字符串以0开头,它总是以八进制形式插入,并在遇到无效字符时停止搜索(例如数字89或像z)这样的角色。

parseInt("070");     //56
parseInt("70");      //70
parseInt("070", 10); //70
parseInt("78");      //78
parseInt("078");     //7, because it stops before 8

如果您需要将字符串转换为数字,并且您确定它不包含无效字符或小数部分,则可以将其乘以1以构成​​数字:

1 * "070";           //70

我个人更喜欢这种方法,并且相信它比调用函数更快。

答案 2 :(得分:0)

现在,几年后,parseInt()似乎可以很好地处理以0开头的数字。当前的浏览器:

parseInt("019"); // 19 on Firefox 67
parseInt("019"); // 19 on Chrome 75
parseInt("019"); // 19 on Safari 12
parseInt("019"); // 19 on IE 11
parseInt("019"); // 19 on Edge 42

但是,此“修复”仍然必须打破依赖parseInt("019")返回10而不是19的旧脚本...