var p = parseInt;
var print = console.log;
for (var i = 1; i < 20; i++) {
var b = []
for(var j = 1; j <= i ; j++) {
b.push(j + '');
}
console.log(b);
console.log('-> map parseInt, result:', b.map(parseInt));
}
大家跑下这个程序,然后和我解释下好么~
@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);}));