“ 近期看到一个关于快手社招前端的面试题,内容是完善add、one、two方法来实现add(one(two()))和add(two(one))打印的值都为3。”
# 面试题目
题目:请补充下面的代码,代码如下所示:
function add() {
}
function one() {
}
function two() {
}
console.log(add(one(two()))) // 3
console.log(add(two(one()))) // 3
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 思路
最开始我也有点懵圈,别着急,先仔细想想自己的思路再来看下面我写的思路和代码,当然也欢迎留言你写的思路和代码,让我们一起share。
看到add函数它的作用就是做加法处理,关于做加法处理我们能想到什么呢?当然是数组中的reduce方法,那么这个时候我们就应该考虑如何让one和two方法与reduce方法进行结合,实现[1,2].reduce((a, b)=>a+b)或者[2,1].reduce((a, b)=>a+b);
在add方法中我们看到它有实参但是没有形参,但是由(1)中需要获取到数组的值,此时就需要考虑到arguments的使用;
再来看one(two())以及two(one()),在这里我们拿one方法进行分析,one(two())中one方法中有一个实参,而在one方法中是没有形参的,这个时候我们应该考虑到arguments的使用,它是可以使用到实参的;
接着再看two(one()),这个时候one方法中没有实参,而one(two())是有实参的,结合(3)中的需要判断arguments的长度进行区分,判断返回是数组还是某一个数值。
# 代码实现
function add () {
return arguments[0].reduce((a, b) => a + b);
}
function one () {
if (!arguments.length) {
return 1;
} else {
return [arguments[0], 1];
}
}
function two () {
if (!arguments.length) {
return 2;
} else {
return [arguments[0], 2];
}
}
console.log(add(one(two()))); // 3
console.log(add(two(one()))); // 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19