['1', '2', '3'].map(parseInt)
的结果?
第一感觉结果应该是[ 1, 2, 3 ]
,但答案却是[ 1, NaN, NaN ]
:
['1', '2', '3'].map(parseInt);
// [ 1, NaN, NaN ]
这是因为map()
方法创建一个新数组,该数组中的每个元素都调用一个提供的函数后返回的结果。
parseInt()
方法接收2个参数,第一个参数为要被解析的字符串,第二个参数表示要解析的数字的基数,可选。
map()
有3个参数,分别是当前元素,索引,数组本身,因为parseInt()
方法接收两个参数,所以这里只用到了前两个参数。
详情请看MDN:
因此,['1', '2', '3'].map(parseInt)
的等价代码实际是:
['1', '2', '3'].map((item, index) => {
return parseInt(item, index);
});
执行三次,返回的值依次是:
parseInt('1', 0); // 1
// 基数为0,数字以10进制来解析,返回1
parseInt('2', 1); // NaN
// 基数为1,数字以2进制来解析,但2>1,无法表示,返回NaN
parseInt('3', 2); // NaN
// 基数为2,数字以3进制来解析,但3>2,无法表示,返回NaN
因此,['1', '2', '3'].map(parseInt)
的返回结果当然是[ 1, NaN, NaN ]
了。
如果就想要返回[ 1, 2, 3 ]
,也是可以的,map
里传递Number
即可:
['1', '2', '3'].map(Number);
// [ 1, 2, 3 ]