parseInt有什么问题?

时间:2013-01-26 08:33:53

标签: javascript

  

可能重复:
  javascript - Array.map and parseInt

我偶然发现了以下代码段:

> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]

这里发生了什么?

2 个答案:

答案 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.

所以你每次都使用不同的基数,从而得到结果。