Javascript中的数字类型转换:parseInt和ToNumber

trlanfeng发布

前言

今天面试一位前端的时候,问到他一个问题:一个数字和一个布尔型用==比较时,类型会如何转换。开始他答的:数字会转换成布尔型,之后改成了:布尔会转换成数字型。我一个迷糊,自己也想不起来了,说是数字会转成布尔。完了之后,我查了下ECMA5.1文档,里面说到是布尔转数字。

于是由这个问题,又引出了我另一个想问但由于自己记不清所以没敢问的问题,字符串和布尔进行比较,类型如何转换?

在文档中确认了一下,是布尔先转成数字,之后字符串也转换成数字进行比较

问题

我记得之前的记忆中,一个字符串转换成数字,是从第一位开始检查的,将可以转换成数字的位置转完,舍弃之后无法转换的。例如:

123abc -> 123

abc123 -> NaN

于是我很自信的认为,console.log('1true' == true);的结果是true,但我运行代码后,发现竟然是false。于是我整个人就懵逼了,难道1true的结果不是1

解决

查看文档后,发现所有数字的隐式类型转换都是用的ToNumber,而我之前记得从第一位开始转的是parseInt

当使用Number创建一个数字时,会对参数进行ToNumber转换,于是我使用console.log(Number('1true'));查看输出,结果是NaN,而parseInt1,而console.log(parseInt('1true') == true);结果也是true

查看parseInt文档后,描述是:如果第一个字符不能被转换成数字,parseInt返回NaN

而Number文档是:如果参数无法被转换为数字,则返回 NaN

所以,这就是我今天说错一个问题后的提升。

分类: Coding