请完善add、one、two方法

2/27/2022 JavaScript

“ 近期看到一个关于快手社招前端的面试题,内容是完善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

# 思路

最开始我也有点懵圈,别着急,先仔细想想自己的思路再来看下面我写的思路和代码,当然也欢迎留言你写的思路和代码,让我们一起share。

  1. 看到add函数它的作用就是做加法处理,关于做加法处理我们能想到什么呢?当然是数组中的reduce方法,那么这个时候我们就应该考虑如何让one和two方法与reduce方法进行结合,实现[1,2].reduce((a, b)=>a+b)或者[2,1].reduce((a, b)=>a+b);

  2. 在add方法中我们看到它有实参但是没有形参,但是由(1)中需要获取到数组的值,此时就需要考虑到arguments的使用;

  3. 再来看one(two())以及two(one()),在这里我们拿one方法进行分析,one(two())中one方法中有一个实参,而在one方法中是没有形参的,这个时候我们应该考虑到arguments的使用,它是可以使用到实参的;

  4. 接着再看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