今天看见一道面试题:["1","2","3"].map(parseInt)
答案是多少?
答案是[1,NaN,NaN]
对map()方法不太了解就去搜了一下:Array.prototype.map(),里面也包含了对这道面试题的详解。
map()方法返回一个由原数组中的每个元素调用一个指定方法后返回值组成的新数组。
语法
array.map(callback[,thisArg])
具体参数上面的链接中能看见,也就不重复了。
描述
map 方法会给远数组中的每个元素都按顺序调用一次 callbak 函数。 callback 每次执行后的返回值(包括 undefined )组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用,那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。
callback 函数会被自动传入三个参数:数组元素,元素索引,原数组本身。
如果 thisArg 参数有值,则每次 callback 函数被调用的时候, this 都会指向 thisArg 参数上的这个对象。若省略了 thisArg 参数,或者赋值为 null 或 defined,则 this 指向全局对象。
map 不修改调用它的原数组本身(当然可以在 callback 执行时改变原数组)。
使用 map 方法处理数组时,数组元素的范围在 callback 方法第一次调用之前就已经确定了。在 map 方法执行的过程中:原数组中增加的元素将不会被 callback 访问到;若已经存在的元素被改变或者删除,则它们的传递到 callback 的值是map 方法遍历到它们的那一时刻的值;而被删除的元素将不会访问到。
面试题
这个时候就很好理解为什么最后的返回值是[1,NaN,NaN]
了,因为使用parseInt
时,是可以传递两个参数的,第一个参数是被解析的值,第二个参数是进制数。map
方法在调用callback函数时,会给它传递三个参数:当前正在遍历的元素,元素索引,原数组本身,第三个参数parseInt
会忽视,但第二个参数,会把传递过来的索引值当做进制数来使用。所以结果是这样
如果想要得到正确的值,可以这样:
function returnInt(element){
return parseInt(element,10);
}
["1", "2", "3"].map(returnInt);
// 返回[1,2,3]
感觉这个函数和
Array.prototype.forEach()
有点像。。详情Array.prototype.forEach()