['1','2','3'].map(parseInt)的返回值是什么?
你的第一反应结果是不是[1,2,3],但是真正的结果是[1, NaN, NaN]。为什么呢?首先看一下数组中的map方法。
map方法
引入MDN的解释,map()方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
var arr = [1, 2, 3];
var arr1 = arr.map(x => x+1);
console.log(arr1); // 2,3,4
复制代码
可以看出map方法中接受一个函数function,用来处理遍历数组中的每一个元素。
new_array = [].map(function callback(currentValue[,index[,array]]){ // Return element for new_array }[, thisArg]);
复制代码
这个callback一共可以接收三个参数,其中第一个参数代表当前被处理的元素,第二个参数代表该元素的索引。
parseInt函数
parseInt是用来解析字符串,使字符串成为指定基数的整数,parseInt的基本语法,
parseInt(string, radix)
复制代码
接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数。radix是一个介于2-36之间的整数,返回解析后的整数值。 如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN
praseInt('111') // 111
parseInt('111', 0) // 111
// radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理
parseInt('111', 1) // NaN 【2 <= radix <= 36】
parseInt('111', 2) // 7
复制代码
从上面可以看出根据指定不同的radix,返回不同的值。
radix参数为n将会把第一个参数看作是一个数的n进制表示,而返回的值则是十进制。
parseInt('123', 5) // 将'123'看作5进制数,返回十进制数38 => 1*5^2 + 2*5^1 + 3*5^0 = 38
复制代码
下面我们来分析一下['1', '2', '3'].map(parseInt);
- parseInt('1', 0); // radix为0时,使用默认的10进制。
- parseInt('2', 1); // radix值在2-36,无法解析,返回NaN
- parseInt('3', 2); // 基数为2,2进制数表示的数中,最大值小于3,无法解析,返回NaN
map函数返回的是一个数组,所以最后结果为[1, NaN, NaN]