由”二进制里不能有3“引发的对parseInt的思考

看到一道面试题,[“1”, “2”, “3”].map(parseInt) 答案是多少?

心生好奇,做做看,发现卡住,没什么头绪。首先对parseInt不了解,只好百度,看了MDN的解释一度以为parseInt(string, radix)是在[radix]进制下,string转换成数字是多少。于是简单地进行一个测试,parseInt(3,2),应该很简单吧,然鹅返回了个NaN,what?百度知道给了我答案,parseInt(string, radix)表示[radix]进制下写成的string,转换成一个10进制数是多少。此处2进制下不可能写成3,因而返回NaN。

重看一下网上对于这道面试题的解答,看到这么一句,“因为字符串的值不能大于基数,二进制里不能有3,返回 NaN ”。看了半天MDN上parseInt的解释,也没发现有这条规则啊。乍一看,套用在parseInt(3,2)没问题,但试试parseInt(57, 23)呢,完全可以大于基数啊。

思考来了,因为人类的数字单个拎出来就0-10这11个数字。10进制以下,比如2到9进制,是装不下这全部的11个数字,所以无法随心所欲的写出所有想写的数字(比如2进制写不了2,9进制写不了9)。到了10这个分界线,那就不同了,10进制就涵盖了所有这11个数字,各种组合随便写,比如4954610287。回到parseInt上来,得出结论,radix参数在9以下(包含9),“string的值不能大于radix的值”这句话才是对的,radix>=10后,那就天高任鸟飞,string取多少都没问题

 

 其实在刚看到这道面试题的时候,还有个疑问,同样是语法不熟导致的啊,羞愧。就是map怎么会传3个参数到parseInt这个方法里面去的呢。看了MDN才了解到,“callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。” parseInt作为map的callback,被自动传入了三个参数,第三个被省略,数组的索引成了parseInt的radix基数。

看到这里,想必这道面试题答案也就迎刃而解了。不能小看了任何一个问题,一道简单的面试,涵盖了那么多知识点值得深挖呀。

 

posted @ 2021-08-18 09:40  巨魔战将  阅读(209)  评论(0编辑  收藏  举报