["1","2","3"].map(parseInt)为什么是[1,NaN,NaN]
首先,要想理解这个结果,就必须先深入理解parseInt函数和map函数的含义。
parseInt()
用法:将传入的字符串解析成数值,并返回一个结果。
语法:parseInt(string,radix)
string | 必填。待转换的字符串参数。 |
radix | 选填,若忽略次参数或传入0,则以十进制来解析。转换使用的基数(即多少进制)。取值范围在2~36之间,如果不在这个范围,则解析结果会返回NaN。 |
注意:
parseInt()会根据传入的字符串识别出整数格式,如果字符串以“0x”开头且后跟数字字符,就会将其当做一个十六进制数,如果以“0”开头且后跟字符串,ECMAScript3则会将其当做一个八进制数来解析(ECMAScript5会判断为十进制)。
map
ECMAScript5的内置数组迭代方法,将数组作为它的参数,对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组。
语法:array.map(callbackfn[, thisArg])
例子:将数组每一项乘以2以后,返回新数组
[1,2,3].map(function(value) { return value*2; })
注意:
回调函数的使用为:function callbackfn(item, index, array) {},即会传入三个参数——数组每一项元素的值、元素的索引、整个数组对象。
标题的原因
因为parseInt()是javaScript的内置函数,所以在用map迭代时,会给parseInt()函数传入三个值,即传入的情况是这样的:
//强制把数组元素的索引传到parseInt()的第二个参数中 parseInt("1", 0, ["1", "2", "3"]); parseInt("2", 1, ["1", "2", "3"]); parseInt("3", 2, ["1", "2", "3"]);
第三个数组参数被忽略,运行的结果为:
将字符串“1”转换成十进制,结果为1;
将字符串“2”转换成1进制,这里不存在1进制,也就是说不符合2~36的范围,返回NaN;
同理,第三个元素的处理也是NaN。
因此!最后返回的结果为标题中的[1,NaN,NaN]。