# 只要一个实参
# unary函数
先来看一个奇怪的例子:
// example1
["1","2","3"].map( parseFloat );
// [1,2,3]
["1","2","3"].map( parseInt );
// [1,NaN,NaN]
@前端进阶之旅: 代码已经复制到剪贴板
在上面的例子中,我想要将一组字符串全部设置成数字类型,但是在调用parseInt的时候,却出现了这样怪异的事情。这是为什么呢?
首先我们来说一下parseInt(str,radix)这个函数,它接受两个参数,第一个是要被解析的字符串,第二个为可选参数,表示要解析的数字的基数。该值介于 2 ~ 36 之间,比如:
parseInt("10"); //返回 10
parseInt("19",10); //返回 19 (10+9)
parseInt("11",2); //返回 3 (2+1)
@前端进阶之旅: 代码已经复制到剪贴板
- 当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
- 如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
而在案例1中,由于我们在调用map的时候,函数时会传入三个实参:value、index 和 list。parseInt()又会接收2个参数,所以每次都相当于是将value和index传入进去了。这样就造成后面2个NaN的情况。
根据上面,我们可以看到,在实际开发中,我们会面临这样一个问题:在设计一个实用函数传入一个函数,而这个实用函数会把多个实参传入函数,但可能你只希望你的函数接收单一实参。如上面的parseInt()函数,我在调用它的时候希望它每次只接收一个参数。
根据上面的需要,我们是不是可以来实现这么一个简单的实用函数,它包装一个函数调用,让这个函数在每次调用的时候只接收一个参数:
function unary(fn) {
return function onlyOneArg(arg) {
return fn(arg)
}
}
// ES6
var unary = fn =>
arg =>
fn(arg);
@前端进阶之旅: 代码已经复制到剪贴板
很简单的一层封装,也很好理解。
现在我们用它来配合上面的案例1:
["1","2","3"].map( 