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

Kir*_*met 21 javascript

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

Mat*_*all 30

如果输入字符串以0开头,它只"默认"为8.这是来自C和C++的不幸遗留物.

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

我如何解决JavaScript的parseInt八进制行为?


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


注意:ECMAScript严格模式删除八进制语法.

  • 是的。它是愚蠢的、邪恶的、糟糕的、令人讨厌的——一个设计糟糕的“功能”,仅仅因为以前的语言就实现了它。 (2认同)
  • 一元"+"是比使用"数字"更好的选择.一元`+`忽略八进制格式(但仍然遵循十六进制格式)并且比函数调用更快. (2认同)
  • @Reid:更好的选择取决于你的用法.至于性能,我不是100%确定`+`更快(并且几乎可以肯定所有浏览器都不一样).我们来看看:http://jsperf.com/string-to-int-2 (2认同)

Lek*_*eyn 8

如果一个数字以0和(包括)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
Run Code Online (Sandbox Code Playgroud)

如果你需要将一个字符串转换为一个数字,并且你确定它不包含无效字符或小数部分,你可以将它乘以1来得到一个数字:

1 * "070";           //70
Run Code Online (Sandbox Code Playgroud)

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

  • 对于那些不明白Matt Ball所说的内容的人来说,提交的第一个答案仅包含第一段. (2认同)

kra*_*er1 5

现在,几年后,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
Run Code Online (Sandbox Code Playgroud)

但是,这个“修复”必须打破依赖parseInt("019")返回10代替19……的旧脚本。