暗无天日

=============>DarkSun的个人博客

Javascript中神奇的map

https://medium.com/dailyjs/parseint-mystery-7c4368ef7b21 看到的,觉得大开眼界,有必要记录一下。

在JavaScript中运行

['1','7','11'].map(parseInt)

得到的结果居然会是

[1, NaN, 3]

这个结果真是让人目瞪口呆,产生这个结果的原因主要在于JavaScript的 map 函数事实上是对 parseInt 传递了三个参数而不是一个:数组元素、元素对应的索引、以及完整的数组 比如:

[1,2,3,4,5].map(console.log)

的结果为 screenshot-02.png

parseInt 实际上能接受两个参数:一个字符串和一个基数,其中基数参数如果为false,则使用默认值,10进制。 因此

['1','7','11'].map(parseInt)

实际上执行的是

parseInt('1', 0,['1','7','11'])
parseInt('7', 1,['1','7','11'])
parseInt('11',2,['1','7','11'])

这里又涉及到另一个JavaScript的特性: 无论函数定义了多少形参,JS允许使用任意数量的实参进行调用, 不够的参数用 undefined 补充,多余的参数被省略。

function foo(x, y) {
    console.log(x);
    console.log(y);
}
foo(1, 2);      // logs 1, 2
foo(1);         // logs 1, undefined
foo(1, 2, 3);   // logs 1, 2

因此

parseInt('1', 0,['1','7','11'])
parseInt('7', 1,['1','7','11'])
parseInt('11',2,['1','7','11'])

等价于执行

parseInt('1', 0)
parseInt('7', 1)
parseInt('11',2)

而在JS中 0false,因此基数参数使用了默认值 10,也就是

parseInt('1', 0)

等价于

parseInt('1', 10)

综上所述,

最终结果为 [1,NaN,3]