上周五去面试,最后面试官说做道题吧。就直接扔了张纸过来,上面就写了两行
add(2,5) //7
add(2)(5) //7
我一看,这不简单嘛!于是洋洋洒洒写下了
const add = (a)=> (b)=> a + b;
写完还想怎么这么简单。果然,面试完回来上网查了一下,原来面试官想要的答案是随意参数累加啊!
实现这个功能,我想了几个关键的地方:
- 对于不确定个数的参数,可以用ES6的rest参数,详情看阮老师的教程,当然也可以用es5的arguments类数组对象
- 实现累加的方法 Array.prototype.reduce(),或者forEach()也行.
- 因为实现累加的函数调用accu()返回的还是函数,所以需要重写accu的valueOf方法,以返回需要的累加值。
说到valueOf,就简单说一下。
在下面两种情况下,函数会自己调用valueOf()或者toString()
- 函数的返回值不是基本数据类型(Number,String,Boolean,null,undefined)
- 函数的 valueOf() 和 toString() 任一或两者被override
在 valueOf() 和 toString() 都被override的情况下,会优先调用valueOf(),如果valueOf()返回的不是基本数据类型,再调用toString()
于是,答案应该是下面这样。
const add = (...args)=> {
let sum = args.reduce((pre,crt)=> pre + crt);
const accu = (...args2)=> {
sum += args2.reduce((pre,crt)=> pre+crt);
return accu;
}
accu.valueOf = ()=> sum;
return accu;
}
add(2,3,4) // 9
add(2)(5) // 7
add(2,3)(5)(1) // 11
小疑惑
- 返回值是Symbol
- valueOf()以及toString()的返回值都不是基本数据类型
在以上两种情况下 把返回值在控制台打印出来是这样的
#<Function>
测试代码如下:
const testA = ()=> {
const fn =()=> {
console.log('called');
return fn;
}
fn.valueOf = ()=> {
return [];
}
fn.toString = ()=> {
return {};
}
return fn;
}
console.log(testA()());
这个** #<Function>** 是什么,有没有大神解答一下,好人一生平安!