例题: [1,2,3].map(parseInt)
先看看 map 和 parseInt 用法
Array.prototype.map()
语法
array.map(callback[, thisArg])
callback函数的执行规则
参数:自动传入三个参数
currentValue(当前被传递的元素);
index(当前被传递的元素的索引);
array(调用map方法的数组)
返回值:对每个传入callback的数组元素进行处理后,返回的值组成一个新的数组。
callback处理的数组范围:
只处理有值的索引。没有被赋值、被delete删除的索引不会被处理。
在处理过程中新增的元素不会被callback处理。
在处理过程中被删除的元素不会被callback处理。
在处理过程中被改变的元素,会以callback执行到该元素时的值被处理。
tips:综合2-4条:在callback第一次调用前,已经确定了被处理数组的最大范围。
thisArg
callback函数被调用时,this会指向thisArg参数所传的对象;
不向thisArg传值、或传的值为null/undefined时,this指向全局对象。
副作用
map方法对原数组不产生影响,(除非callback执行时改变了原数组)。
parseInt()
语法
parseInt(string, radix)
参数string
要被解析的值。
该参数可以不是字符串。如果不是字符串,会将其转换为字符串
字符串开头的可以有空白,空白会被忽略
参数radix
转换所采用的基数,2到36之间。
解析规则
string参数被看做radix指定进制下的数要把它转换成十进制的整数。
没有指定基数/基数为0时:
参数string以“0x”或“0X”开头,radix取16;
参数string以“0”开头,ECMAScript5规定radix只能取10,然而ECMAScript3允许radix取8。具体的解析结果依然由实现环境而定。
其他情况下,radix取10.
基数为1或大于36时:解析结果为NaN。
基数处于2到36之间时:如果string参数的第一个字符(除空白以外),不属于radix指定进制下的字符,解析结果为NaN;如果第一个字符属于radix指定进制下的字符,则解析到不属于radix指定进制下的字符时,将忽略该字符及其后的所有字符。
题目分析
理解了所有背景知识以后,让我们再来看一下这道题:
["1", "2", "3"].map(parseInt)
考察的知识点为:
1. callback函数自动传入三个参数:currentValue;index;array。
map方法的callback函数——parseInt方法,在没有指定传入的参数的情况下,将自动接收三个参数。在遍历过程中,parseInt的调用情况如下:
parseInt("1", 0, ["1", "2", "3"])
parseInt("2", 1, ["1", "2", "3"])
parseInt("3", 2, ["1", "2", "3"])
2. parseInt方法接收两个参数。
第三个参数["1", "2", "3"]将被忽略。parseInt方法将会通过以下方式被调用
parseInt("1", 0)
parseInt("2", 1)
parseInt("3", 2)
3. parseInt的第二个参数radix为0时,ECMAScript5将string作为十进制数字的字符串解析;
parseInt的第二个参数radix为1时,解析结果为NaN;
parseInt的第二个参数radix在2—36之间时,如果string参数的第一个字符(除空白以外),不属于radix指定进制下的字符,解析结果为NaN。
parseInt("3", 2)执行时,由于"3"不属于二进制字符,解析结果为NaN。
综上,["1", "2", "3"].map(parse)的返回结果为[1, NaN, NaN]。