网红面试题['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].

posted @ 2019-03-06 16:06  夏天的薰风  阅读(838)  评论(0编辑  收藏  举报