【问题标题】:Why does the radix for JavaScript's parseInt default to 8?为什么 JavaScript 的 parseInt 的基数默认为 8?
【发布时间】:2011-04-08 20:20:34
【问题描述】:

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    如果输入字符串以 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.

    【讨论】:

    • 你能告诉我更多关于这个结转的信息吗?
    • 是的。它是愚蠢的、邪恶的、糟糕的和令人讨厌的——一个设计不佳的“功能”仅仅因为以前的语言就实现了。
    • 一元 + 比使用 Number 更好。一元 + 忽略八进制格式(但仍支持十六进制格式)并且比函数调用更快。
    • @Reid:更好的选择取决于您的使用情况。至于性能,我不能 100% 确定 + 更快(而且几乎可以肯定,并非所有浏览器都相同)。让我们看看:jsperf.com/string-to-int-2
    • C(++) 什么时候有了 parseInt?当然,只有整数文字的这一方面是(或者在 ECMAScript 5 中被删除之前)是一种遗留物,而 parseInt 的行为方式完全是另一回事。
    【解决方案2】:

    如果一个数字以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
    

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

    1 * "070";           //70
    

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

    【讨论】:

    • 对于那些不明白马特鲍尔在说什么的人,提交的第一个答案只包含第一段。
    • 所有这些都已经过时了。以前,以 0 开头的整数文字被标记为八进制,但现在它是非法的(另请参阅我对马特回答的评论)。但我被告知 parseInt 的这种行为从来都不是标准的一部分,现在标准规定带有一个参数的 parseInt 总是使用小数。
    【解决方案3】:

    现在,几年后,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 的旧脚本...

    【讨论】:

    • 这对Number.parseInt 也成立吗?
    • 019 无论如何都不是有效的八进制数,因为它包含数字 9,这有什么区别吗? MDN 使用了015 的例子,但是我不知道所有数字都低于8是否有意义。
    • @Tim Even 015 现在似乎在 Firefox 和 Chrome 上都作为 base 10 工作。而且我相信这是一个相对较新的变化,一两年前我仍然被它咬住(或者可能是 node.js?它现在在 v12.20+ 上也可以正常工作)。
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2019-11-23
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2012-06-28
    相关资源
    最近更新 更多