本文深入分析JavaScript中parseInt函数的行为,重点解释以0开头的字符串为何会被解析为八进制,导致08和09返回0。通过示例说明如何显式指定radix参数为10来确保十进制解析,并补充NaN处理规则,帮助开发者避免常见的类型转换陷阱。
JavaScript parseInt 函数八进制解析陷阱详解
在JavaScript语言中,
parseInt有一个名为
parseInt的函数,许多开发者都知道它的主要用途是进行字符串到整数的转换。
然而,你是否思考过这样一个问题:
当执行parseInt("07")时,返回值是多少?
而当执行parseInt("08")时,返回值又是多少?
实际运行结果可能出乎意料:
parseInt("07") 返回8
parseInt("08") 返回0
这背后的原因究竟是什么?
这个问题可能并未引起大多数开发者的注意。
在使用JavaScript的parseInt函数时,
parseInt("08")或者parseInt("09")返回的居然是0,
而parseInt("01")...parseInt("07")都是正确的。
为什么会出现这种差异?
起初这很难理解,后来发现出现这个问题的原因是当在前面有"0"时,
JavaScript的解释器(或调试器)会认为这是一个八进制数,
而"08"和"09"不是一个合法的八进制数,
所以导致了那个问题,但是parseFloat不会存在这个问题。
在JavaScript参考文档中,parseInt()函数的描述如下:
parseInt 方法
返回由字符串转换得到的整数。将字符串转换成整型。
parseInt(numString, [radix])
其中parseInt的参数radix:
可选项。在 2 和 36 之间的表示 numString 所保存数字的进制的值。如果没有提供,则前缀为 '0x' 的字符串被当作十六进制,前缀为 '0' 的字符串被当作八进制。所有其它字符串都被当作是十进制的。
因此,如果使用parseInt("08",10)或者parseInt("09",10),
通知JavaScript解释器使用十进制来解析就可以得到你要的数字。
补充说明:
parseInt("abc") // 返回 NaN。
parseInt("12abc") // 返回 12。