出去面试的时候当问到这个问题你的第一想法是什么?
- 这太简单了,手到擒来。
- 面试官太水了
- 卧槽,平时没注意,这有点蒙
- 不对劲,肯定不会这么简单,那么他挖的坑在哪儿呢?
- …
不管你的内心在yy啥,下面就直奔今天的主体,在控制台看看到底输出了什么。
['1','2','3'].map(parseInt)
// [1, NaN, NaN]
是不是有些意外?
对于一些同学来说结果是[1,2,3]
,没想到输出的结果是 [1, NaN, NaN]
那么为什么呢,到底哪儿出了问题呢?
主要的问题还是在parseInt
出了问题,那么现在就深入的了解一下。
首先map是将一个回调作为参数进行传递的,而这个回调有三个参数,分别是item, index, arry
如下:
const arry = ['1', '2','3'];
arry.map((item, index, arry) => {
console.log('item, index, arry => ', item, index, arry)
})
/*
输出如下结果:
VM2513:3 item, index, arry => 1 0 (3) ['1', '2', '3']
VM2513:3 item, index, arry => 2 1 (3) ['1', '2', '3']
VM2513:3 item, index, arry => 3 2 (3) ['1', '2', '3']
*/
而此时传入一个parseInt
作为一个参数进行回调,那么需要知道parseInt也是有接收参数的,分别是string, radix
, 如下:
parseInt(string, radix)
/*
string 是必须参数
radix 参数是作为一个非必须基数存在的。代表的是以多少进制(2-36)而进行转换的。
*/
说明:以下解释是从w3c里面获取的。
如果字符串以 “0x” 开头,则基数为 16(十六进制)
如果字符串以 “0” 开头,则基数为 8(八进制)。此特性已弃用
如果字符串以任何其他值开头,则基数为 10(十进制)
注意:只返回字符串中的第一个数字!
注释:允许前导和尾随空格。
注释:如果第一个字符不能转换为数字,parseInt() 返回 NaN。
注释:旧浏览器将导致 parseInt(“010”) 为 8,因为旧版本的 ECMAScript(比 ECMAScript 5 旧)当字符串以 “0” 开头时使用八进制基数 (8) 作为默认值。从 ECMAScript 5 开始,默认值为十进制基数 (10)。
所以map 与 parseInt 的结合就是如下所示:
const arry = ['1', '2','3'];
function aa (item, index, arry) {
return parseInt(item, index);
}
arry.map((item, index, arry) => parseInt(item, index));
// (3) [1, NaN, NaN]