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 中 `parseInt` 函数的用法 `parseInt` 是用于解析字符串并返回整数的一个全局函数。该函数尝试将给定的字符串转换成一个指定基数(通常为十进制)下的整数值[^1]。 如果遇到无法识别为数字字符的部分,则停止解析,并返回已经成功解析到的结果部分作为整数。当输入为空或完全不可解析时,会返回 `NaN` (Not-a-Number)。 #### 基本语法 ```javascript parseInt(string, radix); ``` - **string**: 要被解析的字符串。 - **radix** *(可选)*: 表示要使用的进制系统的数字(介于 2 到 36)。如果不提供此参数,默认情况下将以十进制来解释数字;但如果字符串以 "0x" 开头则会被认为是十六进制,仅以零开头则是八进制。 #### 使用实例 下面是一些具体的例子展示如何使用 `parseInt()`: ```javascript console.log(parseInt('123')); // 输出: 123 console.log(parseInt('12.34')); // 输出: 12 console.log(parseInt('12a3b', 16)); // 输出: 29859 (因为'a'=10,'b'=11) console.log(parseInt('abc')); // 输出: NaN console.log(parseInt('0xF', 16)); // 输出: 15 console.log(parseInt('070')); // 输出: 56 (在某些环境中可能被认为是八进制) ``` 对于不带小数点的有效数字串,`parseInt` 可以正常工作并将它们转化为相应的整型值。然而需要注意的是,在处理带有前导零或其他特殊格式的情况下,可能会得到意想不到的结果,因此建议总是显式指明所需的进制系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值