网红面试题['1','2','3'].map(parseInt)解析
1、console.log(['1','2','3'].map(parseInt));
答案:[1,NaN,NaN];
首先是map方法的定义
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
语法
array.map(function(currentValue,index,arr), thisValue)
实例
1 var nums=[10,20,30]; 2 nums.map(function(value,index,arr){ 3 document.write('value值为:'+values); //10 20 30 4 document.write('index值为:'+index); //0 1 2 5 document.write('arr值为:'+arr); //[10,20,30] 6 }
生成新数组元素的函数,使用三个参数:
currentValue
callback 数组中正在处理的当前元素。
**index可选 ** 看到这里先注意起来这个参数,思考一下
callback 数组中正在处理的当前元素的索引。
array可选
callback map 方法被调用的数组。
thisArr可选
执行 callback 函数时使用的this 值。
map 也是常有用的一个array的prototype方法,大家并不陌生,好现在我们来看一看 parseInt,这个方法
原因
原因: 其实就是 map的callback的第二个参数 index 也就是当前元素的索引 被当做parseInt 的第二个参数radix 的来使用了
我们原本以为我们的的三次调用时这样的
1 parseInt('1') 2 parseInt('2') 3 parseInt('3')
实际上是这样被调用的
1 parseInt('1',0,thisArray); 2 parseInt('2',1,thisArray); 3 parseInt('3',2,thisArray);
第一次,当我我们第一次调用的时候 是这样的:parseInt('1',0),转十进制的返回1
第二次,调用第二个index参数是1,也是说1作为数值的基础。规范里说的很清楚了,如果基础是非0或者小于2,函数都不会查询字符串直接返回NaN
第三次,2作为基数。这就意味着字符串将被解析成字节数,也就是仅仅包含数值0和1。parseInt的规范第十一步指出,它仅尝试分析第一个字符的左侧,这个字符还不是要求基数的有效数字。这个字符串的第一个字符是“3”,它并不是基础基数2的一个有效数字。所以这个子字符串将被解析为空。第十二步说了:如果子字符串被解析成空了,函数将返回为NaN
所以这里的结果就应该是[1,NaN,NaN].