作者:JoeSeifi译者:前端小智作者:DmitriPavlutin有梦想,有干货,微信搜索【大招走向世界】关注这个洗碗智慧谁是一大早还在洗碗。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,里面有完整的测试站点、资料和我的一线厂商访谈系列文章。parseInt()是一个内置的JS函数,用于解析数字字符串中的整数。例如,要解析数字字符串'100':constnumber=parseInt('100');number;//100正如预期的那样,'100'被解析为整数100。parseInt(numericalString,radix)还接受第二个参数:从2到36,代表字符串的基数。例如,指定16表示解析的值为十六进制数。请注意,10不是默认值,2、8、10和16是最常见的。例如,我们使用parseInt以二进制方式解析数字字符串:constnumber=parseInt('100',2);number;//4100对应二进制数4,所以返回4一个整数值。这就是为什么你可以(但不应该)使用parseInt()来提取浮点数的整数部分:parseInt(0.5);//=>0parseInt(0.05);//=>0parseInt(0.005);//=>0parseInt(0.0005);//=>0parseInt(0.00005);//=>0parseInt(0.000005);//=>0提取浮点数的整数部分,如0.5、0.05等,结果为0,与预期相同。提取0.0000005的整数部分怎么样?parseInt(0.0000005);//=>5parseInt()将浮点数0.0000005解析为5。为什么parseInt(0.0000005)有如此奇怪的行为?2、解决parseInt()的怪异行为我们看一下parseInt(numericalString)的第一个参数:如果不是字符串,则将其转为字符串,解析,返回解析后的整数。这可能是第一个线索。然后我们尝试手动将浮点数转换为字符串表示形式:String(0.5);//=>'0.5'字符串(0.05);//=>'0.05'字符串(0.005);//=>'0.005'字符串(0.0005);//=>'0.0005'字符串(0.00005);//=>'0.00005'字符串(0.000005);//=>'0.000005'字符串(0.0000005);//=>'5e-7'显式转换为字符串(0.0000005)字符串的行为不同于其他浮点数:它以指数形式表示。这是第二条重要线索!当指数符号被解析为整数时,我们得到数字5parseInt(0.0000005);//=>5//与parseInt(5e-7)相同;//=>5//与parseInt('5e-7')相同;//=>5parseInt('5e-7')考虑第一个数字'5',但跳过'e-7'。谜团已经解开!因为parseInt()总是将它的第一个参数转换为字符串,所以小于10的6次方的浮点数将用指数表示。parseInt()然后从浮点数的指数表示法中提取整数。另外,为了安全提取浮点数的整数部分,推荐使用Math.floor()函数:Math.floor(0.5);//=>0Math.floor(0.05);//=>0Math.floor(0.005);//=>0Math.floor(0.0005);//=>0Math.floor(0.00005);//=>0Math.floor(0.000005);//=>0Math.floor(0.0000005);//=>03.总结parseInt()是一个将一串数字解析为整数的函数。尝试使用parseInt()提取浮点数的整数部分时必须小心。小于10的-6次方的浮点数(比如0.0000005,即5*10-7)在转换为字符串时写成指数记数法(比如5e-7就是0.0000005的指数记数法)).这就是为什么在parseInt()中使用如此小的浮点数会导致意想不到的结果:仅解析指数符号的重要部分(例如5e-7中的5)。所以现在你可以尝试解释为什么parseInt(999999999999999999999)等于1?~完了,我去做保健了,下期见~代码部署后可能出现的bug,无法实时知道。之后为了解决这些bug,我花了很多时间在日志调试上。顺便给大家推荐一款好用的BUG监控工具Fundebug。原文:https://dmitripavlutin.com/pa...交流有梦想,有干货,微信搜索【大千世界】关注这位凌晨还在洗碗的洗碗智者。本文GitHubhttps://github.com/qq44924588...已收录,有完整的测试站点、资料和我的一线厂商访谈系列文章。
