网红面试题['1','2','3'].map(parseInt)

前言

作为一道大厂考过的题,有必要在这里探讨一番,首先测试一下结果:

1
2
3
var a=new String;
a=['1','2','3'].map(parseInt);
console.log(a);

结果返回数组[1,NaN,NaN]

parseInt将字符串转换成整形,map再将所有整形数据存在数组里,
不应该是[1,2,3]的么,NaN是什么鬼?


map

map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。

语法:

1
array.map(function(currentValue, index, arr), thisIndex)
  • currentValue:必须。当前元素的的值。

  • index:可选。当前元素的索引。

  • arr:可选。当前元素属于的数组对象。

  • thisValue:可选。对象作为该执行回调时使用,传递给函数,用作”this”的值。

栗子:


这里用到了箭头函数,等同于匿名函数:

1
2
3
4
a=a.map(function(num){
num+1;
return num;
})

parseInt

parseInt() 函数解析一个字符串参数,并返回一个指定基数的整数

语法:

1
parseInt(string, radix)

举个栗子:


需要注意的是语法中的基数radix

可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。

如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

总结

现在回到题目中:

1
['1', '2', '3'].map(parseInt)

++map()方法创建了一个新数组,但新数组并不是在遍历完array1后才被赋值的,而是每遍历一次就得到一个值
parseInt()传递两个参数: 字符串基数。++

所以实际执行的的代码是:

1
2
3
['1', '2', '3'].map((item, index) => {
return parseInt(item, index)
})

这里的index是数组中正在处理的当前元素的索引,这里被作为基数传进来

因为parseInt只接收2个参数,因此map的callback函数就只传递(item, index)这两个值给parseInt。

那么上面的函数就可以分解为求解下面这三个函数的值,并返回结果
即返回的值分别为:

1
2
3
parseInt('1', 0) // 1
parseInt('2', 1) // NaN 2已经超过1进制的表达范围了
parseInt('3', 2) // NaN 3不是二进制

请我喝杯咖啡吧~

支付宝
微信