unary和parseInt的经典大坑

一个js里比较经典的坑 ['1','2','3'].map(parseInt) 的值是什么?

[1,NaN,NaN]

显然这个结果不是我们所期望的,造成这个的原因是parseInt接受两个参数:

parseInt(string,radix)

  • string : 要被解析的值,如果参数不是字符串,则将其转换为字符串(使用ToString抽象操作).字符串开头的空白符将会被忽略.

  • radix : 一个介于2和36之间的整数(数字系统的基础),表示上述字符串的基数.比如参数'10'表示使用我们通常使用的十进制数值系统.始终指定此参数可以消除阅读该代码时的困惑并且保证转换结果可预测.当未指定基数时,不同的实现会产生不同的结果,通常认为其默认值为10,但是请在使用时总是显示的指定它.

map 三个参数调用了函数,分别是element,index和 arr. 如意如果把parseInt 传给map 函数,map会把index的值传给parseInt的radix参数,从而导致了上面的结果.

于是,到了我们的unary函数出场的时候了:

 _.unary = (fn) =>
        fn.length === 1
            ? fn
            : (arg) => fn(arg);

我们检查传入的fn是否有一个长度为1的参数列表(可以通过length属性查看).如果有,就什么都不做,如果没有,就返回一个新数组,它只接受一个参数arg,并用该参数调用fn.

示例: ['1','2','3'].map(unary(parseInt)); // [1,2,3]

Last updated