前言
最近刷题的时候发现了一道很经典的面试题,其实之前也遇到过,但是之前的理解都是模模糊糊的,今天总算整明白了,先分享出来供大家参考,如有错误还请广大网友指正。
正文
1. 本题考查的主要是三个知识点
- Array.map方法callback的参数问题
- js中形参,实参
- parseInt方法的使用
Array.map的callback返回给parseInt方法3个参数(value, index, array),但是parseInt方法只接受了前两个参数,所以上面的题目就等价于
['1', '2', '3'].map((item, index) => {
return parseInt(item, index)
})
// [1, NaN, NaN]
上面的说明也很简单,大家一看就明白了,下面才是本文真正的开始
2. parseInt
['1', '2', '3'].map(parseInt) = [parseInt('1', 0), parseInt('2', 1), parseInt('3', 2)]
1. radix 为 0 、false、null、undefined,如果 string 不包含 0x,一般默认为十进制
parseInt('1', 0) // 1
parseInt('2', false) // 2
parseInt('3', null) // 3
parseInt('4', undefined) // 4
parseInt('5') // 5 这也是平时工作中使用最多的操作
2. 当 radix > 0 && (radix > 36 || radix < 2) 返回NaN
parseInt('2', 1) // NaN
parseInt('2', 37) // NaN
3. 当string左起第一个数大于等于radix,返回 NaN
parseInt('5215213', 5) // NaN
4. string左起第一个数小于radix,就做运算,直到遇到一个大于等于radix,就不操作
parseInt('4215213', 5) // 111
parseInt('4215213', 9) // 2254242
parseInt('4215213', 5)
'4215213'中的前3位是小于5的,所以计算公式是
4 * Math.pow(5, 2) + 2 * Math.pow(5, 1) + 1 * Math.pow(5, 0) // 111
parseInt('4215213', 9)
'4215213'中全都是小于9的,故
4 * Math.pow(9, 6) + 2 * Math.pow(9, 5) + 1 * Math.pow(9, 4) + 5 * Math.pow(9, 3) + 2 * Math.pow(9, 2) + 1 * Math.pow(9, 1) + 3 * Math.pow(9, 0) // 2254242
结语:需要先判断string中的数字小于或等于radix的个数,然后再根据个数按照上面的方式计算。
参考链接
- https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/4
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map