@sunfuze ['1', '2'].map(parseInt)是把数组元素的index(也就是0和1)当做parseInt的radix参数,相当于执行了
parseInt('1', 0);
和
parseInt('2', 1);
这个问题不是map不科学,是parseInt函数的处理方式有些让人费解。
就你那段代码的执行结果来说,比如
["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"]
-> map parseInt, result: [1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 9, 11, 13, 15, 17]
相当于执行了
parseInt('1', 0); //返回1是正确的,这个时候默认按10进制解析
parseInt('2', 1); //因为radix小于 2,不在规定的2~36这个范围内,所以返回 NaN
parseInt('3', 2); //此时radix为2,会按2进制解析,但是因为2进制只能解析以0和1开头的字符串,所以返回NaN
parseInt('4', 3); //当radix为3,4,5,6,7,8,9时,解析规则比较混乱,有一个规律是如果被解析的数字大于radix,则返回NaN
所以 "3", "4", "5", "6", "7", "8"的解析结果都是NaN
parseInt('10', 9); //当被解析的数为10时,返回radix自身
parseInt('11', 10); //此时按10进制解析
parseInt('12', 11); //返回 (12-10)+11
’13‘,‘14’ 同理
总体来说parseInt函数的radix参数最好指定为常用的几个进制,如2进制、8进制、10进制、16进制,使用其他的数值的话,解析规则会比较混乱,结果不好预知。解析规则可以参考一下 http://www.w3school.com.cn/jsref/jsref_parseInt.asp
你那段代码这样修改一下,显式的指定上进制,就能正确执行了:
console.log('-> map parseInt, result:', b.map(function(n){parseInt(n, 10);}));