今天继续来聊一个面试题,平时上班太忙的同学可以活动活动脑子。
这个题目只有一行代码,但是知识点不只一个。
当然我们的目的不在于做题,而在于解题的过程。
通过一步一步的分析,得出合理的答案。
看题目
1[1,2,3].map(parseInt)
没错,就一行
(如果很清楚了可以到此打住)
相信大家都见过这个题
下面是我的解析,如果有错误恳请留言斧正
1.解析
1. Array.prototype.map()
首先要理解下 map 这个函数,他会返回一个新的数组,结果是数组每个元素都会调用下传入 map 的这个函数而得到的返回值
比如:
1var arr = [1,2,3]; 2arr.map(x => x * 2);
新的数组的元素都会*2 ,结果是[2,4,6]
好了,我们已经了解了 map 的基本能力。
但是我们发现传入 map 的函数 - parseInt,我们并没有显示的传入参数,可能我们平常的写法是这样的
1[1,2,3].map((item)=>{ 2return parseInt(item) 3})
当然这两种写法所得到的结果是不同的。
以下是 mdn 的说明,
callback 函数会被自动传入三个参数,(当前数组元素,元素索引 index)
原数组本身这个可以忽略了,因为 parseInt只处理前两个参数,后面的参数会忽略。
所以到这里我们能推算出具体的执行代码
1parseInt(1,0); 2parseInt(2,1); 3parseInt(3,2);
2. parseInt 方法
到这里我们确定了上面代码得结果就可以了。
parseInt的第一个参数我们都知道,也经常用。然而第二个参数我们大多会传10,其他值很少传。
所以这里有两种理解-
a.第二个参数表示第一个参数的格式,是10进制还是2进制的
b.第二个参数表示 parseInt 返回的结果是10进制的,还是2进制的
我不知道有没有人会理解成 b 这个解释,开始学前端的时候我就这么认为的。
这里是官方的说明:
也可以理解成,parseInt 返回的是10进制的自然数,第二个参数是表示的是第一个参数的格式,也就是基数。
那么什么样的基数是合理的呢?
基数不合理或者第一个参数不是数字,返回结果是什么呢?
第二个参数:基数是 在2-36之间
那么到这里答案应该就差不多出来了
1parseInt(1,0); 2parseInt(2,1); 3parseInt(3,2);
parseInt(1,0) ;
结果是1,参数0会当做是 false 处理,所以会默认是10进制.
parseInt(2,1);
结果是 NaN,因为基数1不合理 但是文档并没有说明这对返回值的影响,经测试是 NaN.
parseInt(3,2);
结果是 NaN,基数是合理范围内,但是3不是2进制。转换失败,结果是 NaN。
到这里解析完成。
3. 总结
虽然只是一行代码,但是关联知识点很多。
- 数组map方法 的能力
- 数组 map 方法的参数
- parseInt 的能力和理解
- parseInt基数的理解