parseInt有什么问题?

shr*_*ing 12 javascript

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

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

> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?

geo*_*car 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)
Run Code Online (Sandbox Code Playgroud)

第二个是:

parseInt('10',1, ['10','10',...]) // => NaN because radix is 1
Run Code Online (Sandbox Code Playgroud)

第三:

parseInt('10',2, ['10','10',...]) // => 2 because 10 in binary is the number "2"
Run Code Online (Sandbox Code Playgroud)

等等.


Sir*_*rko 5

来自MDN文件:

parseInt通常与一个参数一起使用,但需要两个参数.第二个是基数对于回调函数,Array.prototype.map传递3个参数:元素,索引,数组第三个参数被parseInt忽略,但不是第二个参数,因此可能会产生混淆.

所以实际上你parseInt传递了以下值:

// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.
Run Code Online (Sandbox Code Playgroud)

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