["1", "2", "3"].map(parseInt) 为何返回[1,NaN,NaN]而不是[1,2,3]

提示是:

what you actually get is [1, NaN, NaN] because parseInt takes two parameters (val, radix) and map passes 3 (element, index, array)

翻译一下是

parseInt 需要 2 个参数 (val, radix), 而 map 传递了 3 个参数 (element, index, array)」。


理解这个问题,需要两步


1.首先要了解回调函数的语法:

语法如下所示:

function callbackfn(value, index, array1)

可使用最多三个参数来声明回调函数。


回调参数 定义

value 数组元素的值。

index 数组元素的数字索引。

array1 包含该元素的数组对象。

2.parseInt() 函数

语法

parseInt(string, radix)


参数 描述

string 必需。要被解析的字符串。

radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 `0`,则数字将以 10 为基础来解析。如果它以 `"0x"` 或 `"0X"` 开头,将以 16 为基数。


如果该参数小于 2 或者大于 36,则 `parseInt()` 将返回 `NaN`。

举个栗子,用 parseInt() 来解析不同的字符串:

parseInt("10");         // 返回 10 (默认十进制)

parseInt("19",10);      // 返回 19 (十进制: 10+9)

parseInt("11",2);       // 返回 3 (二进制: 2+1)

parseInt("17",8);       // 返回 15 (八进制: 8+7)

parseInt("1f",16);      // 返回 31 (十六进制: 16+15)

parseInt("010");        // 未定:返回 10 或 8


也就是说map调用回调函数时,会给它的回调函数传递3个参数,要接受几个随回调函数自己,这里的parseInt() 函数接受2个,也就是接受了map调回调函数时给的function callbackfn(value, index, array1)中的value, 和ndex。

即:parseInt() 函数接受value作为它的string,接受index(数组元素的索引,就是位置)作为它的radix。这样就明白了,看下面的栗子:

var parseInt = function(string, radix) {

    return string + "-" + radix;

};

["1", "2", "3"].map(parseInt);

输出结果为:

["1-0", "2-1", "3-2"]

看见,map 函数将数组的值 value 传递给了 parseInt 的第一个参数,将数组的索引传递给了第二个参数。 

解释"3-2",你见过16进制的数里出现大于f的数字吗,你见过10进制的数字某一位可以大于9吗,所以把3转换成2进制时出现进制错误。2进制的数里只能出现0或者1,不可能出现3的!所以其他也就明白了,再看几个:

parseInt("1", 0);    // 十进制 1
parseInt("2", 1);    // 第二个参数不在 2-36 直接
parseInt("3", 2);    // 二进制 NaN
parseInt("4", 3);    // 三进制
parseInt("5", 4);
parseInt("6", 5);
parseInt("7", 6);
parseInt("8", 7);
parseInt("9", 8);
parseInt("10", 9);   // 九进制 (1*9+0 = 9)
parseInt("11", 10);  // 十进制 (1*10+1 = 11)
parseInt("12", 11);
parseInt("13", 12);
parseInt("14", 13);
parseInt("15", 14);
parseInt("16", 15);
变式练习:

> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"].map(parseInt)
   [1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 9, 11, 13, 15, 17, 19, 21]
bingo~


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值