【发布时间】:2011-04-08 20:20:34
【问题描述】:
在 JavaScript 的 parseInt 函数中将基数默认为 8(如果字符串以 0 开头)让我很恼火,只是因为我继续忘记将可选的第二个参数作为 10 传递。我正在寻找一个答案来告诉我为什么将其默认为 8 是有意义的。
【问题讨论】:
标签: javascript
在 JavaScript 的 parseInt 函数中将基数默认为 8(如果字符串以 0 开头)让我很恼火,只是因为我继续忘记将可选的第二个参数作为 10 传递。我正在寻找一个答案来告诉我为什么将其默认为 8 是有意义的。
【问题讨论】:
标签: javascript
如果输入字符串以 0 开头,它只会“默认”为 8。这是 C 和 C++ 的不幸继承。
您可以改用Number('0123'),或者,正如您在问题中所说,parseInt('0123', 10)。
How do I work around JavaScript's parseInt octal behavior?
你能告诉我更多关于这个结转的信息吗?
【讨论】:
+ 比使用 Number 更好。一元 + 忽略八进制格式(但仍支持十六进制格式)并且比函数调用更快。
+ 更快(而且几乎可以肯定,并非所有浏览器都相同)。让我们看看:jsperf.com/string-to-int-2
如果一个数字以0 开头并包含(包括)0 到 7 之间的数字,则它被解释为八进制数(以 8 为底而不是 10)。
然而,在 parseInt 中,如果一个字符串以 0 开头,它总是以八进制形式插入,并在遇到无效字符时停止搜索(例如数字 8 或 9 或像 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
我个人更喜欢这种方法,并且相信它比调用函数更快。
【讨论】:
现在,几年后,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") 返回 1 或 0 而不是 19 的旧脚本...
【讨论】:
Number.parseInt 也成立吗?
019 无论如何都不是有效的八进制数,因为它包含数字 9,这有什么区别吗? MDN 使用了015 的例子,但是我不知道所有数字都低于8是否有意义。
015 现在似乎在 Firefox 和 Chrome 上都作为 base 10 工作。而且我相信这是一个相对较新的变化,一两年前我仍然被它咬住(或者可能是 node.js?它现在在 v12.20+ 上也可以正常工作)。