JavaScript的parseInt()方法

今天发现一个以前测试没有出现的问题,是一个javascript校验日期的方法。
当当前日期为2004-12-08时,我要得到日的数字,然后就用到了parseInt(date.getDate())也就是parseInt('08')。
这样调用后返回值是0。最后导致方法校验失败。而其他日期都没有问题,经过查看javaScript帮助文档。有下面的说明:
parseInt 方法
返回由字符串转换得到的整数。
parseInt(numString, [radix])
参数
numString
必选项。要转换为数字的字符串。
radix
可选项。在 2 和 36 之间的表示 numString 所保存数字的进制的值。如果没有提供,则前缀为 '0x' 的字符串被当作十六进制,前缀为 '0' 的字符串被当作八进制。所有其它字符串都被当作是十进制的。

说明
parseInt 方法返回与保存在 numString 中的数字值相等的整数。如果 numString 的前缀不能解释为整数,则返回 NaN(而不是数字)。

最后我把方法修改为parseInt('08', 10)就正确了。parseInt('08')怎么会返回0呢?这个方法是按照八进制进行处理,而8是八进制中永远不会出现的。所以导致转换失败。

在用javascript的parseInt函数时,parseInt("08")或者parseInt("09")返回的居然是0,而parseInt("01")...parseInt("07")都是正确的,一开始很难理解,后来发现出现这个问题的原因是当在前面有"0"时,javascript的debugger会认为这是一个八进制数,而"08"和"09"不是一个合法的八进制数,所以导致了那个问题,但是parseFloat不会存在这个问题。

事实上,parseInt方法有一个可选参数来表示数字的进制,所以这应该不能算是一个bug,只是我们平时没有注意到这种细节问题。那么解决的方法很简单,就是使用parseInt("08",10)或者parseInt("09",10),通知javascript解释器使用十进制来解析就可以了。

还有,当进行数字比较时,如在分页中,输入页数的时候,如果用parseInt()来转换就必须注意这个问题,否则当输入如108,109等页数时就无法准确定位。
当然我们可以不用parseInt()方法来转换,直接比较数字,但是这时候又有一个需要注意的地方:
如果没有进行转换,JavaScript比较是按照字符串的方式来比较的,不管你赋予的是数字,字符还是布尔值,所有当比较数字时,会从第一位开始比较。但是我们还必须比较长度,否则有可能出现45大于234的情况,因为从第一位开始,4大于2,所以会出错误。当时如果比较了长度,因为长度45长度小于234,所以根本就不用按每一位来比较了。

你可能感兴趣的:(JavaScript)