我偶然发现了以下代码段:
> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]
这里发生了什么?
答案 0 :(得分:13)
首先查阅Array.prototype.map的文档。关键是这一行:
使用三个参数调用回调:元素的值,元素的索引,以及要遍历的Array对象。
(强调我的)
然后查看parseInt的文档:
parseInt函数将其第一个参数转换为字符串,对其进行解析,并返回一个整数或NaN。如果不是NaN,则返回的值将是作为指定基数(基数)中的数字的第一个参数的十进制整数表示。例如,10的基数表示从十进制数转换,8八进制,十六进制16,依此类推。对于大于10的基数,字母表中的字母表示大于9的数字。例如,对于十六进制数字(基数16),使用A到F.
和
如果radix未定义或为0,则JavaScript假定以下内容:
如果输入字符串以“0x”或“0X”开头,则基数为16(十六进制)。
如果输入字符串以“0”开头,则基数为8(八进制)。此功能是非标准的,有些实现故意不支持它(而是使用基数10)。因此,在使用parseInt时始终指定基数。
如果输入字符串以任何其他值开头,则基数为10(十进制)。
所以第一个电话是:
parseInt('10',0, ['10','10',...]) // => 10 (because radix=0)
第二个是:
parseInt('10',1, ['10','10',...]) // => NaN because radix is 1
第三个:
parseInt('10',2, ['10','10',...]) // => 2 because 10 in binary is the number "2"
等等。
答案 1 :(得分:5)
来自MDN docu:
parseInt通常与一个参数一起使用,但需要两个参数。第二个是基数 对于回调函数,Array.prototype.map传递3个参数:元素,索引,数组 第三个参数被parseInt忽略,但不是第二个参数,因此可能会产生混淆。
所以实际上你的parseInt
传递了以下值:
// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.
所以你每次都使用不同的基数,从而得到结果。