提示是:
what you actually get is
[1, NaN, NaN]
becauseparseInt
takes two parameters(val, radix)
andmap
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);
bingo~> ["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]