关于map的一个问题,表示很不科学啊
发布于 10 年前 作者 sunfuze 4426 次浏览 最后一次编辑是 8 年前
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));
}

大家跑下这个程序,然后和我解释下好么~

8 回复

parseInt的参数问题

@ravenwang 能说详细点么,难道每个参数不是数字字符么?

@sunfuze parseInt有两个参数,第二个是进制数,map会给调用的函数传两个参数,第二个是index

@ravenwang 比如这样['1', '2'].map(parseInt)是把当做parseIntindex参数?

@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);}));

楼上正解。不过有一点小小的瑕疵,没有把parselnt 的结果返回。 console.log(’-> map parseInt, result:’, b.map(function(n){return parseInt(n,10);})); 这样就能跑出正确的结果。已测试。

回到顶部