我偶然发现了以下代码片段:
> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]
这里发生了什么事?
我偶然发现了以下代码片段:
> ['10','10','10','10','10'].map(parseInt);
[10, NaN, 2, 3, 4]
这里发生了什么事?
首先查阅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"
等等。
来自MDN 文档:
parseInt 通常与一个参数一起使用,但需要两个。第二个是基数 对于回调函数,Array.prototype.map 传递 3 个参数:元素、索引、数组。 parseInt 忽略第三个参数,但不会忽略第二个,因此可能会造成混淆。
所以实际上你parseInt
被传递了以下值:
// 1st run:
parseInt( '10', 0 );
// 2nd run:
parseInt( '10', 1 );
// etc.
所以你每次都使用不同的基数,导致看到的结果。