14

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

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

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

这里发生了什么事?

4

2 回答 2

13

首先查阅Array.prototype.map的文档。关键是这一行:

callback 使用三个参数调用:元素的值、元素的索引和被遍历的 Array 对象。

(强调我的)

然后检查parseInt的文档:

parseInt 函数将其第一个参数转换为字符串,对其进行解析,并返回一个整数或 NaN。如果不是 NaN,则返回值将是第一个参数的十进制整数表示形式,该参数采用指定基数(基数)中的数字。例如,基数 10 表示从十进制数、8 位八进制数、16 位十六进制数等转换。对于大于 10 的基数,字母表中的字母表示大于 9 的数字。例如,对于十六进制数(以 16 为基数),使用 A 到 F。

和:

如果 radix 未定义或为 0,JavaScript 假定如下:

  • 如果输入字符串以“0x”或“0X”开头,则基数为 16(十六进制)。

  • 如果输入字符串以“0”开头,则基数为八(八进制)。这个特性是非标准的,一些实现故意不支持它(而是使用基数 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"

等等。

于 2013-01-26T08:38:24.983 回答
5

来自MDN 文档

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

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

// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.

所以你每次都使用不同的基数,导致看到的结果。

于 2013-01-26T08:39:03.007 回答